web-dev-qa-db-ja.com

systemctlで停止した後、サービスが失敗した状態のままになる

mineCraftサーバーをサービス方式で起動する単純なsystemdスクリプトがあります。 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)

何か案が?

ありがとう

19
kalise

終了コード143は、プログラムが終了するように指示するSIGTERMシグナルを受信したが、そのシグナルを適切に処理しなかったことを意味します。これはほとんど常にプログラミングエラーが原因であり、すべてのタイプのJavaアプリケーションでよく見られます。

ユニットファイルに「成功」​​の終了ステータスとして終了コードを追加することで、これを抑制できるはずです。

[Service]
SuccessExitStatus=143
27
Michael Hampton

Michaelの回答を補足するために、ここでは終了コード143が正常です。これは、Java VMがSIGTERMシグナルを受信し、systemdが送信して停止する方法です。プロセス。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プログラムが外部信号のために終了したことを確認できるため、このゼロ以外の終了コードはここで意味があり、どの信号を見つける機会が得られます。

11
Manu