質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

1回答

3705閲覧

Play Frameworkアプリの、exit codeが0になるような止め方(もしくは正常stopならOnFailureを発火させないSystemd設定)

yuba

総合スコア5568

systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/07/22 02:20

編集2022/01/12 10:55

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

LinuxプロセスはSIGTERMを受け取ると、デフォルトで143が返ってくるようです。(sleepでもこのエラーコードでした)
http://stackoverflow.com/questions/6963811/jvm-returns-error-143
systemdから起動する場合は、ExecStartとExecStopでスクリプト経由で起動して制御するのが
一番難易度が低いのではないかと思います。

投稿2016/07/22 04:36

skitoy4321

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2016/07/22 04:43

スクリプトでエラーステータスを隠す方法、本当に起動に失敗したときにもまるで正常終了したような結果になりかねないのをどうしようというのを考えていましたが、143=SIGTERMであるということは143の場合に限ってエラーステータスをなかったことにするという対応はできそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問