systemd "After ="は、サービスを開始する前に内部サービスが失敗せずに開始されることを確認しますか?

systemd "After ="は、サービスを開始する前に内部サービスが失敗せずに開始されることを確認しますか?

例:

bar.service:

[Unit]
After=foo.service

foo.serviceが正しく起動しない場合、bar.serviceは起動しますか? foo.serviceが何にも依存せずに起動しない場合はどうなりますか?

答え1

After=xこれを次の意味で考えるべきです。

  • このジョブは、ジョブ「x」が完了した後に開始される。
  • これは、ジョブ「x」の実行結果について何も示さず、ジョブ「x」が実行されるまでこのジョブを待つことを示します。

~からman systemd.unit:

最も重要なのは、サービスユニットの場合、設定されたすべてのBefore=起動After=コマンドが呼び出され、そのコマンドが失敗したか成功した起動を報告すると、起動が完了したと見なされることです。これにはExecStartPost=(または ExecStopPost=終了の場合)含まれます。

Requires=これらの設定は、またはの設定されたWants=要件のRequisite=依存関係とは無関係で直交ですBindsTo=After=オプションにデバイス名を含めるのが一般的なパターンですWants=。この場合、リストされたデバイスは、これらのオプションで設定されたデバイスの前に起動されます。

したがって、これは次のことを意味します。

  1. bar.servicefoo.service失敗した状態で終了しても起動します。
  2. foo.serviceアクティブになっていない場合は、他のデバイスがアクティブになるbar.serviceのを待ちます。foo.service
  3. bar.service満たされていない依存関係が失敗した状態になる可能性が非常に高いです。
    待ち時間は他の設定(例:)によって制御されますJobTimeoutSec=JobRunningTimeoutSec=(望むより:システムサービスのタイムアウト値を変更するには?)このイベントをキャッチする
    ために使用できますJobTimeoutAction=
  • 編集する:(2)と(3)はのみ適用されるため、使用されなくなりましたRequisite=foo.service。 @TooTeaを修正していただきありがとうございます。

関連情報