Systemd タイマーの混乱

Systemd タイマーの混乱

Systemd 経由で実行しているプログラムがあり、特定の時間にそれを開始/停止する方法を考えています。これは永続的なプログラム (送信) です。

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

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

これを Systemd タイマー ファイルに変換するのに苦労しています。

さらに、再起動時に現在の時刻に基づいてサービスを実行する必要があるかどうかを systemd (または cron) でチェックすることは可能ですか?

ご協力ありがとうございます。もし、以前に同じ質問があった場合は、まさにこの種類の具体的な例を教えてください。私が見つけたもののほとんどは、15 分間隔でサービスを実行する方法などです。

答え1

1 時間に 1 回スクリプトを実行し、再起動時に実行するタイマーを用意する方が簡単かもしれません。そのスクリプトは、現在の時間がデーモンを実行する必要がある時間かどうかを確認し、必要に応じて (おそらく確認後systemctl is-active $service) サービスを開始または停止します。このスクリプトは、ファイルをチェックしたり、他のビジネス ロジックに基づいて動作して、実行する必要があるかどうかを判断することもできます (たとえば、touch ~/.fooservice-do-not-runファイルによって無効になる可能性がある場合や、負荷が高すぎる場合など)。

答え2

systemdでタイマー経由でサービスを開始するには、2つのユニットファイルを使用します。X.サービス実際のサービスを記述するファイルと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

sleepoff.サービス:

[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

関連情報