systemd建立定時任務

Systemd or Cron

Cron是類Unix系統裏最多見的任務計劃程序,而Systemd也開始提供定時器做爲Cron的替代品。儘管爭議不斷,Systemd仍是被愈來愈多的Linux發行版使用,Ubuntu也是如此。所以在須要建立定時任務時我決定向"邪惡勢力"低頭,基於Systemd來實現。命令行

Systemd配置根據功能劃分到不一樣的單元,如系統服務(.service)屬於服務單元,定時器(.timer)則屬於定時器單元。每種單元有本身的配置文件格式。日誌

不一樣於Cron經過crontab一行添加一個定時任務,Systemd要建立定時任務須要建立兩個文件,一個定時器單元文件定義定時任務的激活時間,一個服務單元文件定義定時器激活時執行的具體任務。從這個角度想,至關於定時任務激活時經過systemctl start XXX.service啓動了一個系統服務。不過一個定時任務須要兩個文件這種方式仍是很麻煩了。code

systemd建立定時任務的主要步驟事件

  • 建立服務單元文件
  • 建立定時器單元文件
  • 啓動定時器

建立定時器單元文件

定時器單元文件是以timer爲後綴的systemd單元文件,定時器單元文件包括三個部分crontab

  • Unit
  • Timer
  • Install

[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模式下加載單元文件的路徑,優先級從高到低有

  • /etc/systemd/system
  • /run/systemd/system
  • /lib/systemd/system

Systemd在user模式下加載單元文件的路徑,優先級從高到低有

  • $XDG_CONFIG_HOME/systemd/user
  • $HOME/.config/systemd/user
  • /etc/systemd/user
  • $XDG_RUNTIME_DIR/systemd/user
  • /run/systemd/user
  • $XDG_DATA_HOME/systemd/user
  • $HOME/.local/share/systemd/user
  • /usr/lib/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
相關文章
相關標籤/搜索