Служби залишаються в невдалому стані після припинення роботи з systemctl


19

у нас є простий системний сценарій для запуску сервера 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)

Будь-яка ідея?

Спасибі

Відповіді:


27

Вихідний код 143 означає, що програма отримала сигнал SIGTERM, щоб доручити їй вийти, але вона не обробляла сигнал належним чином. Це майже завжди пов’язано з помилками програмування і досить часто зустрічається з програмами Java всіх типів.

Ви зможете придушити це, додавши вихідний код у файл одиниці як статус виходу "успіху":

[Service]
SuccessExitStatus=143

Це працює. Зараз сервіс перебуває в неактивному статусі, як і очікувалося.
kalise

4
Який би "правильний" спосіб обробляти сигнал за допомогою програми Java? Найближчими, які я можу знайти, були б гачки відключення, але ніде в документації не згадується, що гачки відключення змінюють код виходу програми.
SPAage

@SPoage stackoverflow.com/q/2975248/1068283 Але, здається, Java завжди завершується з кодом 143 в цьому випадку, навіть якщо відключення гачок присутній.
Майкл Хемптон

11

Для доповнення відповіді Майкла, тут вихідний код 143 нормальний, це спосіб, коли java VM отримав сигнал SIGTERM, надісланий системою, щоб зупинити процес. Сигнал SIGTERM має числове значення 15 (див. man signal).

Тепер згідно зі специфікацією Posix, "Стан виходу команди, яка припинилась через отримання сигналу, повідомляється як більша ніж 128". ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

Тут Java VM додає 128 + 15, і ви отримуєте цей вихідний код 143.

Цей ненульовий код виходу тут сприймає, оскільки це дозволяє побачити, що ваша програма java вийшла із-за зовнішнього сигналу, і ви отримаєте шанс дізнатися, який сигнал.


Текст специфікації POSIX, позначається, вказує на те, як повинна поводитися оболонка, і говорить "Оболонка є інтерпретатором мови командної". Здається, що VM Java не є чимось охопленим цією специфікацією. Як оболонка інтерпретує Java VM (або будь-яку іншу програму), що закінчується через SIGTERM - що вона повинна встановити вихідний код на 143 - безумовно, підпадає під специфікацію, але я впевнений, що тут немає жодної оболонки.
doshea

Ви маєте рацію в тому, що ця специфікація POSIX спрямована на оболонку UNIX, але тут схоже, що автори JVM вирішили реалізувати свій зворотний код так само.
Ману
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.