システムタイマーの混乱

システムタイマーの混乱

Systemdを介して実行されるプログラムがありますが、特定の時間にこれを開始/停止する方法を理解しようとしています。これは永久プログラム(転送)です。

現在、次の行を含むcrontabがあります。

0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon

これをSystemdタイマーファイルに変換しようとしています。

また、再起動時にsystemd(またはcron)で現在時刻に基づいてサービスを実行する必要があるかどうかを確認できますか?

助けてくれてありがとう。以前にこの質問を受けたことがある場合は、この具体的な例を教えてください。私が見つけることのできるほとんどは、15分間隔でサービスを実行する方法です。

答え1

時間ごとに再起動時に一度スクリプトを実行するタイマーを持つ方が簡単な場合があり、スクリプトは現在の時間がデーモンを実行する時間であることを確認し、必要に応じて(おそらく確認後systemctl is-active $service)サービスを開始または停止します。 。また、スクリプトはファイルを調べるか、他のビジネスロジックに従ってジョブを実行する必要があるか(たとえば、ファイルが何かをtouch ~/.fooservice-do-not-run無効にできるか、ロードが高すぎるかなど)を決定できます。

答え2

systemdでタイマーを介してサービスを開始するには、2つのユニットファイルを使用する必要があります。10. サービス実際のサービスを記述するファイルX.タイマーサービスの開始時期を説明するファイルです。

おっしゃった方法でサービスをオン/オフするには、別のサービスを用意することが私が考える最善の方法です。キオフ一対のユニットファイル、ここで提供するファイルが互いに競合しています。これキオフサービスは実際には何も実行せず、実際のサービスが終了している間だけ「実行」されます。

アイデアを提供するために、以下はサービスを含むおもちゃの例です。眠る偶数分ごとに開き、奇数分ごとに閉じます。

睡眠・サービス:

[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service

[Service]
ExecStart=/usr/bin/sleep 1d

就寝タイマー:

[Unit]
Description=Timer to start the sleep service.

[Timer]
OnCalendar=*:0/2

睡眠サービス:

[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service

[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true

就寝タイマー:

[Unit]
Description=Timer to stop the sleep service.

[Timer]
OnCalendar=*:1/2

関連情報