
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