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
文件。