
我有一個透過 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 中的計時器啟動服務,您需要使用兩個單元檔案。 A十、服務文件來描述實際的服務,以及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