У меня есть приложение 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
на наличие ошибок после попытки запуска службы.