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

Службы остаются в состоянии сбоя после остановки с помощью systemctl

у нас есть простой сценарий systemd для запуска сервера MineCraft в служебном режиме. SO - это CentOS 7. Вот сценарий:

[Unit]
Description=Minecraft Server
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/root/Minecraft
ExecStart=/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запуск службы работает нормально, но при остановке служба остается в состоянии сбоя. Видеть:

systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: active (running) since Mon 2015-06-01 16:00:12 UTC; 18s ago
 Main PID: 20975 (java)
   CGroup: /system.slice/minecraftd.service
           └─20975 /bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
systemctl stop minecraftd.service
systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: failed (Result: exit-code) since Mon 2015-06-01 16:01:37 UTC; 3s ago
  Process: 20975 ExecStart=/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui (code=exited, status=143)
 Main PID: 20975 (code=exited, status=143)

Любая идея?

Спасибо

Код выхода 143 означает, что программа получила сигнал SIGTERM, предписывающий ей выйти, но она не обработала сигнал должным образом. Это почти всегда происходит из-за ошибок программирования и довольно часто встречается с приложениями Java всех типов.

Вы должны иметь возможность подавить это, добавив код выхода в файл модуля в качестве статуса выхода «успешный»:

[Service]
SuccessExitStatus=143

Чтобы дополнить ответ Майкла, код выхода 143 здесь нормальный, это способ, которым виртуальная машина Java получила сигнал SIGTERM, отправленный systemd для остановки процесса. Сигнал SIGTERM имеет числовое значение 15 (см. man signal).

Теперь, в соответствии со спецификацией Posix, «статус завершения команды, которая завершилась из-за приема сигнала, будет сообщаться как больше 128». (http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02)

Здесь виртуальная машина Java добавляет 128 + 15, и вы получаете код выхода 143.

Этот ненулевой код выхода здесь имеет смысл, поскольку он позволяет увидеть, что ваша java-программа завершилась из-за внешнего сигнала, и у вас есть возможность узнать, какой сигнал.