Назад | Перейти на главную страницу

Запустить HTTP-сервер Java как службу в GNU / Linux

У меня есть приложение Java со встроенным http-сервером grizzly. И я не могу запустить его ни на переднем плане, ни как службу из systemd.

Он отключается сразу после запуска. Я что-то упускаю?

Если я бегу из bash, оболочка остается открытой - все в порядке:

[root@Test-LAPP02 RL_acskidd] java -jar RestListener-3.3-jar-with-dependencies.jar    
    Oct 24, 2017 5:00:37 PM org.glassfish.grizzly.http.server.NetworkListener start
        INFO: Started listener bound to [192.168.18.41:1177]
        Oct 24, 2017 5:00:37 PM org.glassfish.grizzly.http.server.HttpServer start
        INFO: [HttpServer] Started.
        Oct 24, 2017 5:00:38 PM org.glassfish.grizzly.http.server.NetworkListener start
        INFO: Started listener bound to [192.168.18.41:1188]
        Oct 24, 2017 5:00:38 PM org.glassfish.grizzly.http.server.HttpServer start
        INFO: [HttpServer-1] Started.

Но если я попытаюсь запустить его как службу systemd (или даже на переднем плане с помощью & в конце команды), он отключится сразу после запуска:

[root@Test-LAPP02 RL_acskidd]# systemctl start rl_acskidd
Oct 24 17:08:29 Test-LAPP02 Rest Listener ACSKIDD[1826]: Oct 24, 2017 5:08:29 PM org.glassfish.grizzly.http.server.NetworkListener start
Oct 24 17:08:29 Test-LAPP02 Rest Listener ACSKIDD[1826]: INFO: Started listener bound to [192.168.18.41:1177]
Oct 24 17:08:29 Test-LAPP02 Rest Listener ACSKIDD[1826]: Oct 24, 2017 5:08:29 PM org.glassfish.grizzly.http.server.HttpServer start
Oct 24 17:08:29 Test-LAPP02 Rest Listener ACSKIDD[1826]: INFO: [HttpServer] Started.
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: Oct 24, 2017 5:08:31 PM org.glassfish.grizzly.http.server.NetworkListener start
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: INFO: Started listener bound to [192.168.18.41:1188]
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: Oct 24, 2017 5:08:31 PM org.glassfish.grizzly.http.server.HttpServer start
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: INFO: [HttpServer-1] Started.
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: Oct 24, 2017 5:08:31 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: INFO: Stopped listener bound to [192.168.18.41:1177]
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: Oct 24, 2017 5:08:31 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow
Oct 24 17:08:31 Test-LAPP02 Rest Listener ACSKIDD[1826]: INFO: Stopped listener bound to [192.168.18.41:1188]
Oct 24 17:08:31 Test-LAPP02 systemd[1]: Received SIGCHLD from PID 1826 (java).
Oct 24 17:08:31 Test-LAPP02 systemd[1]: Child 1826 (java) died (code=exited, status=0/SUCCESS)
Oct 24 17:08:31 Test-LAPP02 systemd[1]: Child 1826 belongs to rl_acskidd.service
Oct 24 17:08:31 Test-LAPP02 systemd[1]: rl_acskidd.service: main process exited, code=exited, status=0/SUCCESS

Вот мой юнит-файл:

[Unit]
Description=Rest Listener
After=network-online.target

[Service]
Type=service
User=nobody
SyslogIdentifier=Rest Listener
WorkingDirectory=/opt/RL_acskidd
ExecStart=/usr/bin/java -jar RestListener-3.3-jar-with-dependencies.jar

[Install]
WantedBy=multi-user.target

Я погуглил об этой проблеме и увидел, что приложение Java должно быть написано с функциональностью «запускать как служба», но я также вижу, что многие люди все еще могут делать трюки, используя его как модуль systemd.

Я пробовал различные варианты ExecStart = для имитации оболочки, например этот:

ExecStart=/bin/bash -c "/usr/bin/java -jar RestListener-3.3-jar-with-dependencies.jar"

Но все равно не повезло. Где искать, чтобы решить эту проблему? Спасибо за ответы!

Здесь снимок в темноте, но возможно ли, что nobody пользователь не может получить доступ к некоторым файлам или не может открыть порт прослушивания? Я вижу это, когда пробую вашу программу в bash Вы использовали root пользователь, но в вашем systemd unit файл, который вы используете nobody.

Ваша проблема найдена путем запуска systemd-analyze verify в вашем файле, обнаружив эту ошибку:

systemd-analyze verify ./foo.service [/home/mark/tmp/foo.service:6] Failed to parse service type, ignoring: service

Пожалуйста, просмотрите man systemd.service и выберите правильный Type= ценность ваших услуг.

Обязательно проверьте journalctl и journalctl -u your-service-name на наличие ошибок после попытки запуска службы.