systemd は、サービス A が完了した後にのみサービス B を開始します。

systemd は、サービス A が完了した後にのみサービス B を開始します。

1、2時間検索しましたが、正しい解決策が見つからないようです。状況はこんな感じです。

いくつかのサービスがあります。 Dockerコンテナを実行しているサービスAを起動します。アプリケーションが起動し、ファイルisActiveシステムのマウントされたディレクトリにファイルを書き込みます。

サービスとパス単位のファイルBがあります。 watch.pathはisActive存在するのを待ち、watch.serviceを実行し、サービスファイルは「isActiveExists!」をエコーし​​ます。

ロジックのこの部分はうまく機能します。サービスAの起動を使用しsudo journalctl -xefbて監視した後、登録を完了してファイルに書き込みます。その後、サービスBユニットファイルが起動、エコー、完了を確認できます。

その後、サービスを監視するサービスBRequireだけでなく、さまざまなサービスファイル(サービスC / D / E / F)もあります。Afterただし、サービスBが開始/終了する前にサービスC/D/E/Fが開始されます。

これは私の現在の「時計」サービスです:

# watch_for_client.path
[Unit]
Wants=A.service
After=A.service

[Path]
PathExists=/A/B/C/d.txt

[Install]
WantedBy=multi-user.target

# watch_for_client.service
[Unit]
After=A.service

[Service]
Type=oneshot
ExecStart=/bin/echo "file found"

その後、他のファイルに

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

[Service]
...
Type=simple
...

[Install]
WantedBy=multi-user.target

答え1

サービスC / D / E / Fのサービス単位ファイル構成で3つの点を変更する必要があります。

  1. [Unit]セクションで:この行を削除してください。Requires=wait_for_client.service
  2. [Unit]セクション:名前が間違っており、サービスBの名前と一致するAfter=wait_for_client.service
    必要があります。After=watch_for_client.service
  3. {Installation] セクションでは、次のようになります。WantedBy=watch_for_client.service

関連情報