Cron是類Unix系統裏最多見的任務計劃程序,而Systemd也開始提供定時器做爲Cron的替代品。儘管爭議不斷,Systemd仍是被愈來愈多的Linux發行版使用,Ubuntu也是如此。所以在須要建立定時任務時我決定向"邪惡勢力"低頭,基於Systemd來實現。命令行
Systemd配置根據功能劃分到不一樣的單元,如系統服務(.service)屬於服務單元,定時器(.timer)則屬於定時器單元。每種單元有本身的配置文件格式。日誌
不一樣於Cron經過crontab一行添加一個定時任務,Systemd要建立定時任務須要建立兩個文件,一個定時器單元文件定義定時任務的激活時間,一個服務單元文件定義定時器激活時執行的具體任務。從這個角度想,至關於定時任務激活時經過systemctl start XXX.service
啓動了一個系統服務。不過一個定時任務須要兩個文件這種方式仍是很麻煩了。code
systemd建立定時任務的主要步驟事件
定時器單元文件是以timer爲後綴的systemd單元文件,定時器單元文件包括三個部分crontab
[Unit]部分定義了systemd單元文件通用的一些配置,[Install]部分定義安裝systemd單元須要的配置,在systemd執行過程當中不會用到,僅在調用systemctl enable
或者systemctl disable
設置開機啓動時須要。ip
[Timer]部分定義了什麼時候以及如何激活定時事件。Timers 能夠被定義成如下兩種類型:get
單調定時器 即從一個時間點過一段時間後激活定時任務。全部的單調計時器都遵循以下形式: OnTypeSec=。有如下幾種類型it
* OnActiveSec 時間點爲定時器啓動 * OnBootSec 時間點爲系統啓動 * OnStartupSec 時間點爲systemd啓動時間 * OnUnitActiveSec 時間點爲上次定時器任務激活時間 * OnUnitInactiveSec 時間點爲上次定時器任務執行完畢的時間
不一樣的類型能夠組合,以下面的配置,在系統啓動15分鐘後第一次執行,以後每隔1周執行一次。io
[Timer] OnBootSec=15min OnUnitActiveSec=1w
時間間隔的全部定義格式能夠經過man systemd.time
查看。登錄
實時定時器 (亦稱"掛鐘定時器") 經過日曆事件激活(相似於 cronjobs )定時任務。 使用 OnCalender= 來定義實時定時器。
以下面的配置OnCalendar=Wed, 23:15
表示每週三的23點15分執行。日曆事件的詳細定義格式能夠經過man systemd.time
查看。
下面是一個定時器單元文件。
[Unit] Description=Run foo weekly and on boot [Timer] OnCalendar=Wed, 23:15 [Install] WantedBy=timers.target
服務單元文件也包括三部分,只是沒有[Timer]部分,增長了[Service]部分,這部分定於服務執行相關的配置,最經常使用的是ExecStart,設置服務啓動時須要執行的操做。
以下面的服務單元文件,ExecStart=/usr/local/bin/foo
表示啓動時執行foo程序。
[Unit] Description=MyScript [Service] ExecStart=/usr/local/bin/foo
這裏的服務單元只由定時器單元調用,因此不須要[Install]部分。
單元文件要放在Systemd指定的路徑才能生效。Systemd單元按照運行模式分兩種,system模式和user模式。 system模式只要系統在運行就會生效,而user模式在用戶登陸狀態纔會生效。兩種模式下單元文件的路徑也不一樣。
Systemd在system模式下加載單元文件的路徑,優先級從高到低有
Systemd在user模式下加載單元文件的路徑,優先級從高到低有
建立定時器時,定時器單元文件和服務單元文件必須在同一個目錄下,且文件名相同,只是後綴不一樣(一個爲.timer,一個爲.service)。如建立名爲foo的定時器任務,運行在system模式,能夠在/etc/systemd/system/下創建一個foo.timer文件和一個foo.service文件。
Systemd的命令行操做是用過systemctl命令實現的。
啓動定時器
$ systemctl start XXX.timer
中止定時器
$ systemctl stop XXX.timer
設置開機自動啓動
$ systemctl enable XXX.timer
取消開機啓動
$ systemctl disable XXX.timer
查看已啓動的全部定時器
$ systemctl list-timers
查看定時器的運行狀態
systemctl status XXX.timer
定時器運行出錯時須要查看日誌進行分析,systemd日誌爲二進制格式,能夠經過journal命令查看
$ journal -xe