「サービスA」と「サービスB」があります。 「serviceA」はタイマーを使用して12時間ごとに実行され、「serviceB」は15分ごとに実行されます。 「serviceB」が現在実行中の場合、「serviceA」は絶対に実行されず、その逆も同様であることを確認したいと思います。また、「serviceA」が「serviceB」が実行され、「serviceB」が現在実行中のときに「serviceB」を終了しないことを確認したいと思います。
systemdでこれを行うにはどうすればよいですか?
答え1
使用実行が始まる前に:
マンページ ExecStartPre エントリで、次の操作を行います。
"-"プレフィックスなしでこれらのコマンドのいずれかが失敗すると、残りのコマンドは実行されず、デバイスは失敗したと見なされます。
サービスA
[Unit]
Description=Service A 12 hours on timer
[Service]
Type=oneshot
# Check and see if serviceB is running
ExecStartPre="! systemctl is-active --quiet serviceB"
Restart=no
...
サービスB
[Unit]
Description=Service B 15 mins on timer
[Service]
Type=oneshot
# Check and see if serviceA is running
ExecStartPre="! systemctl is-active --quiet serviceA"
Restart=no
...
紛争
このConflicts
ディレクティブを使用すると、このディレクティブが設定されているサービスが開始されると、指定されたサービスが停止します。あなたは次のように言及しました。
また、「serviceA」が「serviceB」が実行され、「serviceB」が現在実行されているときに「serviceB」を終了しないことを確認したいと思います。
しかし、マンページによると、これは双方向関係です。
あるユニットが別のユニットに衝突=を設定した場合、前者を起動すると後者は停止し、その逆の場合も同様です。
したがって、競合する指示を避ける必要があります。