システム:以降=

システム:以降=

コンテキスト

起動が完了し、そのシステムパスデバイスによってデバイスがアクティブになった後にのみ起動したいと思いますA.service。関連するコードスニペットは以下にあります。B.serviceB.serviceB.path

A.service:

[Unit]
After=B.service

B.path:

[Path]
PathExists=/some/path

[Install]
RequiredBy=A.service

質問

A.service起動中にアクティブになり、起動後B.pathB.serviceアクティブになることがわかりますが、/some/path問題はA.service起動が完了する前にまだ起動することです。B.serviceログログを調べると、タイムラインは次のように表示されます。

  • T0:
    • A.service開始済み(設定が依存しているため失敗しましたB.service
    • B.path開始しました
  • T0+X秒:
    • B.service開始しました

X起動中にパスが存在する時点に応じて3〜6です。

文書

systemdドキュメントを確認しましたBefore=, After=(協会)そしてこれを見つけました:

デバイス foo.service に Before=bar.service 設定が含まれ、両方のデバイスが起動する場合

この部分のせいではないかと思いますboth units are being started。特に、B.service存在した後にのみ開始されます。これは起動に数秒/some/pathかかることがあります。XA.service

しかし、ドキュメントの私の理解が正しいか、実際に他のものが欠けているかどうかはわかりません。どちらにしても、私が望むことを達成するために単位ファイルを書くことについての提案をいただきありがとうございます。ありがとうございます!

答え1

問題の実際のユニットファイルが欠落していて回答するのは少し難しいですが、Before=/After=の意味を誤解しているようです。

ユニットファイルで「前/後」を使用する意味は、複数のユニット間の優先順位を決定するときに、「前/後」の条件がそのユニットでタスクが実行される順序を決定することです。

あなたの場合は2つのサービスがあり、そのうちの1つはA.service2番目のサービスに依存しますB.serviceが、2つのサービスに依存関係があることを指定せずに実行順序のみを指定します。もし彼らは一つを持っています。

この場合、次のように参照にRequisite=設定したいと思われます。Requires=Wants=A.serviceB.serviceA.Service

[Unit]
Requires=B.service
After=B.service

この構成では、アクティベーションサービスにアクティベーションがA.service必要になり、B.serviceディレクティブはAfter=独自のディレクティブの実行を完了する前にA.serviceディレクティブの実行を開始しないようにします。ExecStart=B.serviceExecStart=

Requires=Wants=リストされているデバイスがすでに有効になっていることを確認するだけでなく、まだ有効になっていない場合でも有効にします。

Requisite=デバイスが稼働しているかどうかを確認し、そうでない場合は、定義したデバイスはすぐに失敗します。

Before=そしてAfter=同時に呼び出される場合にのみ、デバイスの起動順序を指定します。そのため、現在の設定でA.service以前に有効にすることができ、B.service現在同時に有効になっていないため、順序の依存関係は適用されません。

Before=A.service良いカバレッジエリアを設定することも可能ですB.service

TLDR: 定義する必要があります。両方 After=またRequires=Requires=すでに実行されていない場合は、B.service同時に有効にする必要があります。有効にするタイミングとタイミングを指定するA.service必要があります。これにより、その後まで実行が遅れます。After=A.serviceB.serviceA.serviceB.service

関連情報