Play 2.3で開発しplay dist
でスタンドアロンアプリ化したWebアプリをSystemdでサービス化しています。
Systemdのサービス定義は以下のようなもの。
[Unit] Description=****** Requires=network.target After=network.target OnFailure=unit-status-mail@%n.service [Service] User=****** Group=****** Type=simple PIDFile=/******/RUNNING_PID EnvironmentFile=/******.conf ExecStartPre=/bin/rm -f /******/RUNNING_PID ExecStart=/******/****** ExecStop=/bin/kill $MAINPID ExecStopPost=/bin/rm -f /******/RUNNING_PID Restart=on-failure StandardOutput=null [Install] WantedBy=multi-user.target
Play Frameworkのアプリはプロセス切り離し常駐型ではなく、killされるまで制御を返さないタイプなのでExecStop
がkillコマンドになっているのはドキュメント通りです。killは強制終了ではなく正常終了の信号として働きます。
ところがkillした場合、プロセスのexit codeが0でありません。何が困るかというと、Systemd設定の上の方にあるOnFailure=unit-status-mail@%n.service
が発火し、エラーメールが飛ぶのです。
Systemdのstopコマンドの結果としてkillしたんだからOnFailureを発火なんかさせるなよとは思うのですが、いずれにせよ
・プロセスが0を返して終了するようにする
・stopコマンド後ならプロセスが0以外を返してもOnFailureを発火させない
どちらかの方法が必要です。
これらどちらかについて、方法をご存じの方ご教示いただけますでしょうか。
追記。systemctl stop
後のsystemctl status
の内容は以下のようなもので、exit codeは143となっています。
Loaded: loaded (/usr/lib/systemd/system/*****.service; enabled) Active: failed (Result: exit-code) since 金 2016-07-22 11:28:04 JST; 2min 41s ago Process: 30325 ExecStopPost=/bin/rm -f /*****/RUNNING_PID (code=exited, status=0/SUCCESS) Process: 30315 ExecStop=/bin/kill $MAINPID (code=exited, status=0/SUCCESS) Process: 30228 ExecStart=/***** -Dconfig.file=/*****/conf/application.conf (code=exited, status=143) Process: 30226 ExecStartPre=/bin/rm -f /*****/RUNNING_PID (code=exited, status=0/SUCCESS) Main PID: 30228 (code=exited, status=143)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/22 04:43