システムサービスの戻りコードを処理するスクリプト

システムサービスの戻りコードを処理するスクリプト

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を印刷します。

おすすめ記事