ExecStartPre が失敗した場合、systemd ExecStopPost は実行されませんか?

ExecStartPre が失敗した場合、systemd ExecStopPost は実行されませんか?

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

関連情報