次のようなシナリオを実装したいと思います。
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.target
Before=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
組み合わせることができます。example1
example2
今後 daily-tasks.target
「開始済み」とみなされ、example3
他のすべてのジョブが完了した後に実行されます。