Systemd vs Cron Job
阿恆
傳統的 Linux 管理員都會用 crond 及相關的工具來執行周期性的工作,其實自從 systemd 十多年前取代 System V init 以來,Systemd 和相關的工具,已經包含了執行周期性工作的能力,其彈性和功能遠勝 crond。

Systemd 不是單一的軟件,它是一個軟件套裝,包含很多管理進程 (processes) 的工具,它功能强大,在 Linux 系統中擔當極重要的角色,今天我只討論它在管理周期性工作方面的功能,其他功能將來再討論。
Systemd 用來管理背景進程,這類進程在 Linux 稱爲服務,每一個服務都有一個設定檔,建立一個周期性的工作,最重要的就是編寫這個設定檔。這是一個最簡單的服務設定檔:
| |
Description=Sample Service 是這項服務的名稱(儘管這裏說 Description),這是給用家看的,通常在系統日誌或狀態訊息中出現。
ExecStart 是啓用這項服務的指令。
WantedBy 告訴 systemd 在甚麽系統狀態下才啓用這項服務。如果主機是伺服器,default.target 相當於所有網絡服務已經啓動,系統已經準備好讓用戶登入。如果主機是工作站,default.target 還要額外要求圖像界面已經運作。
總括來説,這個設定檔告訴 systemd 當系統準備好讓用戶登入的時候,執行 /home/peter/bin/sample-service,並把它命名爲 Sample Servce。
把這個設定檔儲存在 /etc/systemd/system/sample-service.service,最後把它加入 systemd 的執行清單中:
| |
下次重新啓動 Linux,便會啓動這項服務。如果現在立即就要執行,可以輸入以下命令:
| |
[Service] 段落還可以設定其他這項服務的其他特性,例如設定工作目錄,可以加入:
| |
設定執行的優先級別,可以這樣:
| |
在 Linux 中進程的優先級別由 -20(最高優先) 到 19(最低優先)。
對於需要持續執行的服務,萬一因某些原因服務死掉,你當然希望 systemd 替你自動重啟,這也很容易,只需加入:
| |
Restart=on-failure 意思是該項服務的結束碼 (exit code) 不是零,或者因受到訊號 (signal) 而終止(除了 SIGHUP, SIGINT, SIGTERM, 或 SIGPIPE),或者超時,Systemd 便會重啟這項服務。RestartSec=10 意思是 systemd 會等待 10 秒才重啟服務。
倘如需要指定這項服務的執行者,可以這樣:
| |
這個例子中的服務只會在系統重新啓動後執行,並且只執行一次。假設你希望它每天下午六時三十分執行,把設定檔中的 [Install] 段落刪掉,只剩下 [Unit] 和 [Service] 兩個段落,即是:
| |
何時啓動這個服務呢?我們新增另一個設定檔 sample-service.timer 來指定它的執行時間:
| |
OnCalendar 指定它在每天 18:30 執行 sample-service.service 設定的服務(注意兩個檔案的名稱相同,只是延伸名稱有分別)。OnCalendar 可以指定很複雜的周期工作,例如每個月 23 日 18:30 執行的工作,可以寫成:
| |
逢星期一至五,每天 6 小時執行一次:
| |
服務設定檔(sample-service.service)和周期設定檔(sample-service.timer)還有很多設定内容,有興趣的話可以查看 systemd.service、systemd.unit、system.exec、systemd.timer 和 systemd.time 文件。