一連のsystemdサービスを実行してから、最終サービスを実行します。

一連のsystemdサービスを実行してから、最終サービスを実行します。

次のようなシナリオを実装したいと思います。

daily_tasksなどの親サービスは毎日XX:00に開始されます。

サービスが開始されると、バックアップ、クリーンアップ、some_stuffなど、並列に実行できる他のサービスも開始されます。

これらすべての操作が完了すると、ドライブのマウント解除、シャットダウンなどの他のサービスが実行されます。

partOf私は最初の2つの部分であるアンブレラーサービスと子供提供する。しかし、どのようにすべてのサービスが完了したかを確認し、他のサービスや別の傘のサービスを開始できるかどうかわかりません。簡単にするとき知らない傘のサービス子供プロセスは無期限に実行され続けます。

systemdがこの問題を処理するように設計されていないという意見があっても、どんなアイデアにも感謝します!

とても感謝しています!

ベストアンサー1

対象ユニットの作成

.targetまず、同期点として機能するセルを作成します。この例では、次のようにしますdaily-task.target

[Unit]
Description=Run daily tasks

日常業務サービスの作成

並列に実行されるサービスの場合、Type=oneshot(a) と (b) を実行するサービス単位を作成します。たとえば、RequiredBy=daily-task.targetBefore=daily-task.target

例 1. サービス

[Unit]
Before=daily-task.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 10; date > /tmp/example1.txt'

[Install]
RequiredBy=daily-task.target

例 2. サービス

[Unit]
Before=daily-task.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 15; date > /tmp/example2.txt'

[Install]
RequiredBy=daily-task.target

ポストサービスの作成

実行する必要があるサービスの場合後ろにすべてのジョブが完了し、RequiredBy=daily-task.targetサービスユニットが(a)作成され(b)実行されますAfter=daily-task.target。たとえば、

例 3. サービス:

[Unit]
Description=Run after all daily tasks are complete
After=daily-task.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 10; date > /tmp/example3.txt'
ExecStopPost=/sbin/systemctl --no-block --user stop daily-tasks.target

[Install]
RequiredBy=daily-task.target

systemctl stop daily-task.targetターゲットを「停止」状態に移動するには、このタスクを(フックを介して)実行しますExecStopPost。そうしないと、systemctl start daily-task.targetターゲットはすでに起動されているため、次に試しても何も起こりません。

サービスの有効化

systemctl --user enable example{1,2,3}.service

開始ターゲット

日常的なタスクを実行するためにターゲットを起動します。

systemctl --user start daily-tasks.target

これが発生したときにログを表示すると、次の内容が表示されます。

Sep 06 17:44:19 hostname systemd[5435]: Starting example1.service...
Sep 06 17:44:19 hostname systemd[5435]: Starting example2.service...
Sep 06 17:44:29 hostname systemd[5435]: Finished example1.service.
Sep 06 17:44:34 hostname systemd[5435]: Finished example2.service.
Sep 06 17:44:34 hostname systemd[5435]: Reached target Start daily tasks.
Sep 06 17:44:34 hostname systemd[5435]: Starting example3.service...
Sep 06 17:44:44 hostname systemd[5435]: Stopped target Start daily tasks.
Sep 06 17:44:44 hostname systemd[5435]: Finished example3.service.

私たちが作成した依存関係は、私たちが使用して実行するサービスと Type=oneshot組み合わせることができます。example1example2今後 daily-tasks.target「開始済み」とみなされ、example3 他のすべてのジョブが完了した後に実行されます。

おすすめ記事