systemd
ここのドキュメントを確認しましたhttps://www.freedesktop.org/software/systemd/man/systemd.service.html。
ExecStartPre=,ExecStartPost=
このセクションでは、
ExecStartPre=、ExecStart=、または ExecStartPost= で指定されたコマンドのいずれかが失敗するか (「-」が付いていない、上記を参照)、サービスが完全に起動する前にタイムアウトした場合、ExecStopPost= で指定されたコマンドで実行が続行され、ExecStop= のコマンドはスキップされることに注意してください。
私のExecStartPre
ルールは
ExecStartPre=/bin/false
にExecStopPost
私は を持っています/bin/echo "I'm at ExecStopPost"
。
サービスは次のようになります
[Unit]
Description=Test
[Service]
Type=oneshot
ExecStartPre=/bin/echo "I'm at ExecStartPre"
ExecStartPre=/bin/false
ExecStart=/bin/echo "Running Test"
ExecStopPost=/bin/echo "I'm at ExecStopPost"
実行して失敗した場合、私はそれを見ることはありません。syslogからの出力は次のようになります。
6月15日 20:48:01 ip-10-0-0-246 echo[8687]: ExecStartPreにいます
6月15日 20:48:01 ip-10-0-0-246 systemd[1]: test.service: 制御プロセスが終了しました。コード=終了 ステータス=1
6月15日 20:48:01 ip-10-0-0-246 systemd[1]: テストの開始に失敗しました。
6月15日 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: ユニットが失敗状態になりました。
6月15日 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 結果 'exit-code' で失敗しました。
私は自分のエコーを見たことがない。
journalctl -u test.service
もちろんこれもエントリとして含まれています。
これを少し異なる方法で設定する必要がありますか? または、 を使用する必要がありますかOnFailure
?
成功または失敗の場合にを再開できるようにする必要がありますConflicts=
。これは、タイマーによってトリガーされるワンショット サービスで使用されます。
ああ、これは 16.04.6 LTS で実行されています。
答え1
oneshot
サービスは失敗しても呼び出されないようですExecStopPost
。このリンクで説明されていますバグ報告。
関連する投稿は
ExecStopPost は、ユニットが実行状態から遷移したとき (ユニットが強制終了された場合でも)、またはメイン PID がアクティブ化状態にあり、サービスがフォーク タイプでないときにのみ実行されます。
違いは、ワンショット サービスの場合、構成された ExecStart アクションが実行されている間、サービスはまだアクティブ化状態にあり、実行されていないことです。ただし、シンプル サービスの場合、systemd はサービスをすぐに実行状態に遷移させ、systemctl はブロックせず、ExecStart が失敗した場合でも (つまり、ExecStart=/bin/false) exit 0 が返されます。したがって、ワンショット サービスは、ExecStopPost を呼び出すために正常に終了する必要があります。私の知る限り、オプション RemainAfterExit は ExecStopPost に影響を与えません。
OnFailure
解決策は、必要な項目を呼び出すためにを追加することでした。ExecStopPost