
systemctlコマンドを使用して開始または停止できるシステムサービスを作成しています。
しかし、プログラムは私が処理したい複数の戻りコードを返すことができます。
たとえば、サービスが停止した場合はsystemctl stop <service>
何もしないでください。しかし、systemctlによって終了せずにそれ自身が返される場合は、戻りコードを取得し、その値に基づいてアクションを実行できるPostScriptを実行したいと思います。
@NarūnasKの回答以降に修正されました
systemdバージョンがv232より大きい場合、@NarūnasKの答えはうまくいきます。
しかし、良いシステムバージョンがなければどうなりますか?
次のようなことをしたい
ExecStart=/bin/sh -c '<service> -C /etc/<service_conf_file>; [ $? -eq 1 ] && { <action> }'
答え1
実行が停止した後=あなたが欲しいものをする必要があります。
サービスが停止した後に実行する追加のコマンド。これには、ExecStop =に設定されたコマンドが使用されているか、サービスにExecStop =が定義されていないか、サービスが予期せず終了する状況が含まれます。このパラメータは、ExecStart =について説明したのと同じスキームに従う複数のコマンドラインを使用します。これらの設定の使用はオプションです。指定子と環境変数の置換をサポートします。 ExecStop =とは異なり、この設定で指定されたコマンドは、サービスが正しく開始されず、再び終了したときに呼び出されます。
この設定は、サービスが正しく開始されない場合でも実行する必要があるクリーンアップ操作にお勧めします。この設定で構成されたコマンドは、サービスが途中で開始されず、不完全に初期化されたデータが残っている場合でも実行できるはずです。この設定で指定されたコマンドが実行されると、サービスのプロセスはすでに終了しているため、そのプロセスと通信しようとしないでください。
この設定で構成されたすべてのコマンドは、$ SERVICE_RESULT、$ EXIT_CODE、および$ EXIT_STATUS環境変数に設定されているサービスの結果コード、および基本プロセスの終了コードと状態で呼び出されます。 exec(5) 詳細を参照してください。 。
スクリプト内で環境$EXIT_CODE
変数を読み、$EXIT_STATUS
適切なアクションを取ることができます。
編集する
次の回避策を使用できますsystemd < 232
。
サンプルスクリプト:
#! /bin/bash --
sleep 5
## Non standard exit code
exit 255
終了ハンドラ:
#! /bin/bash --
CODE="${1:-N/A}"
echo CODE: $CODE
echo SERVICE_RESULT: $SERVICE_RESULT
echo EXIT_CODE: $EXIT_CODE
echo EXIT_STATUS: $EXIT_STATUS
サンプルスクリプト、サービス:
# systemctl cat sample_script.service
# /etc/systemd/system/sample_script.service
[Unit]
Description=My service
After=network.target rsyslog.service
[Service]
Type=simple
Restart=never
ExecStart=/bin/bash -c '/tmp/sample_script || /tmp/exit_handler $?'
ExecStopPost=/tmp/exit_handler
[Install]
WantedBy=multi-user.target
現状サンプルスクリプト、サービス:
# systemctl status sample_script.service
● sample_script.service - My service
Loaded: loaded (/etc/systemd/system/sample_script.service; enabled)
Active: inactive (dead) since Thu 2017-12-14 12:29:16 GMT; 7s ago
Process: 16511 ExecStopPost=/tmp/exit_handler (code=exited, status=0/SUCCESS)
Process: 16505 ExecStart=/bin/bash -c /tmp/sample_script || /tmp/exit_handler $? (code=exited, status=0/SUCCESS)
Main PID: 16505 (code=exited, status=0/SUCCESS)
Dec 14 12:29:11 build-local systemd[1]: Started My service.
Dec 14 12:29:16 build-local bash[16505]: CODE: 255
Dec 14 12:29:16 build-local bash[16505]: SERVICE_RESULT:
Dec 14 12:29:16 build-local bash[16505]: EXIT_CODE:
Dec 14 12:29:16 build-local bash[16505]: EXIT_STATUS:
Dec 14 12:29:16 build-local exit_handler[16511]: CODE: N/A
Dec 14 12:29:16 build-local exit_handler[16511]: SERVICE_RESULT:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_CODE:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_STATUS:
2回呼び出されるのがわかりますexit_handler
。最初にbash
提供された終了コードで始まり、終了ExecStopPost=
コードの位置引数が指定されていないスクリプトでN / Aを印刷します。