systemctlで停止した後、サービスは失敗状態のままです


19

サービス形式で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)

何か案が?

ありがとう

回答:


27

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

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

[Service]
SuccessExitStatus=143

できます。これで、サービスは予想どおり非アクティブ状態になりました。
カリーゼ

4
Javaアプリケーションで信号を処理する「適切な」方法は何でしょうか?私が見つけることができる最も近いものはシャットダウンフックですが、ドキュメントのどこにも、シャットダウンフックがアプリケーションの終了コードを変更することは記載されていません。
SPoage

@SPoage stackoverflow.com/q/2975248/1068283しかし、シャットダウンフックが存在する場合でも、この場合、Javaは常にコード143で終了するようです。
マイケルハンプトン

10

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プログラムが終了したことがわかり、どのシグナルを見つけるかを見つけることができます。


参照されているPOSIX仕様のテキストは、シェルの動作方法を指定しているように見え、「シェルはコマンド言語インタープリターです」と書かれています。Java VMは、その仕様の対象ではないようです。SIGTERMによって終了するJava VM(または他のプログラム)をシェルがどのように解釈するか-終了コードを143に設定する必要があることは、確かに仕様でカバーされていますが、ここにはシェルは含まれていないと確信しています。
-doshea

このPOSIX仕様はUNIXシェルに向けられているという点であなたは正しいのですが、ここではJVMの作成者が戻りコードを同じ方法で実装することに決めたように見えます。
マヌー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.