コンテキスト
起動が完了し、そのシステムパスデバイスによってデバイスがアクティブになった後にのみ起動したいと思いますA.service
。関連するコードスニペットは以下にあります。B.service
B.service
B.path
A.service
:
[Unit]
After=B.service
B.path
:
[Path]
PathExists=/some/path
[Install]
RequiredBy=A.service
質問
A.service
起動中にアクティブになり、起動後B.path
にB.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
かかることがあります。X
A.service
しかし、ドキュメントの私の理解が正しいか、実際に他のものが欠けているかどうかはわかりません。どちらにしても、私が望むことを達成するために単位ファイルを書くことについての提案をいただきありがとうございます。ありがとうございます!
答え1
問題の実際のユニットファイルが欠落していて回答するのは少し難しいですが、Before=/After=の意味を誤解しているようです。
ユニットファイルで「前/後」を使用する意味は、複数のユニット間の優先順位を決定するときに、「前/後」の条件がそのユニットでタスクが実行される順序を決定することです。
あなたの場合は2つのサービスがあり、そのうちの1つはA.service
2番目のサービスに依存しますB.service
が、2つのサービスに依存関係があることを指定せずに実行順序のみを指定します。もし彼らは一つを持っています。
この場合、次のように参照にRequisite=
設定したいと思われます。Requires=
Wants=
A.service
B.service
A.Service
[Unit]
Requires=B.service
After=B.service
この構成では、アクティベーションサービスにアクティベーションがA.service
必要になり、B.service
ディレクティブはAfter=
独自のディレクティブの実行を完了する前にA.service
ディレクティブの実行を開始しないようにします。ExecStart=
B.service
ExecStart=
Requires=
Wants=
リストされているデバイスがすでに有効になっていることを確認するだけでなく、まだ有効になっていない場合でも有効にします。
Requisite=
デバイスが稼働しているかどうかを確認し、そうでない場合は、定義したデバイスはすぐに失敗します。
Before=
そしてAfter=
同時に呼び出される場合にのみ、デバイスの起動順序を指定します。そのため、現在の設定でA.service
以前に有効にすることができ、B.service
現在同時に有効になっていないため、順序の依存関係は適用されません。
Before=A.service
良いカバレッジエリアを設定することも可能ですB.service
TLDR: 定義する必要があります。両方 After=
またRequires=
。Requires=
すでに実行されていない場合は、B.service
同時に有効にする必要があります。有効にするタイミングとタイミングを指定するA.service
必要があります。これにより、その後まで実行が遅れます。After=
A.service
B.service
A.service
B.service