Systemd:あるデバイスが稼働中で、別のデバイスが稼働しているかどうかを確認する方法は?

Systemd:あるデバイスが稼働中で、別のデバイスが稼働しているかどうかを確認する方法は?

「サービス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」を終了しないことを確認したいと思います。

しかし、マンページによると、これは双方向関係です。

あるユニットが別のユニットに衝突=を設定した場合、前者を起動すると後者は停止し、その逆の場合も同様です。

したがって、競合する指示を避ける必要があります。

関連情報