如何建立systemd定時任務

小小怪醫芙蘭發表於2018-11-23

1. 如何建立一個定時任務,通過systemd系統

Linux中,可以使用crontab建立一個定時任務。

首先,建立一個crontab檔案,形如

# 每天的6點42分,執行一次spmake指令碼
42 6 * * * /home/luzj/bin/spmake

緊接著,執行crontab file即可安裝該檔案。之後定時任務即開起

使用crontab -l列出所有在crontab管理下的定時任務,crontab -r xxx刪除定時任務

1.1. systemd中的timer

systemd通過定義一個timer單元來建立一個定時任務。實際上我們需要做兩件事,首先定義一個service單元,
這個service單元定義了我們想定時執行的任務。然後再定義一個timer單元,通過timer單元定義如何定時執行
之前的service單元,比如每1h執行一次、每天5點執行、每個月的16號6點執行等等

1.2. 自定義定時任務

我們自定義一個定時任務——每過30s就向msg.txt輸入當前時間

1.2.1. 具體步驟

首先,建立一個mail.sh指令碼.

vim mail.sh

# 內容
#!/bin/bash
echo `date` >> msg.txt

#新增執行許可權
chmod +x mail.sh

我們先執行一遍,bash mail.sh,就會看到當前時間被寫入msg.txt之中了

建立Service單元.進入/etc/systemd/system目錄中,建立mytimer.service檔案,

vim mytimer.service

#寫入內容
[Unit]
Description=mytimer service

[Service]
ExecStart=/bin/bash <path>/mail.sh

# 這裡可以不新增[Install]區塊,因為該Service是為Timer單元服務的

之後,啟動Service單元,systemctl start mytimer.service.然後就會看到,當前時間
被寫入到msg.txt之中了

建立Timer單元.同樣的目錄,建立mytimer.timer檔案,

vim mytimer.timer

#內容如下
[Unit]
Description=run mail.sh every 10s

[Timer]
OnUnitActiveSec=10s
Unit=mytimer.service

[Install]
WantedBy=multi-user.target

啟動Timer單元.

systemctl daemon.reload
systemctl enable mytimer.timer
systemctl start mytimer.timer

#檢視timer執行狀態
systemctl status mytimer.timer
tail -f msg.txt # 檢視列印情況,每10s會列印一次,我的實測 時間間隔不是很精確哈
journalctl -f -u mytimer.timer # 檢視定時器執行日誌

1.2.2. [Timer]區塊屬性詳情

OnActiveSec:定時器生效後,多少時間開始執行任務
OnBootSec:系統啟動後,多少時間開始執行任務
OnStartupSec:Systemd 程式啟動後,多少時間開始執行任務
OnUnitActiveSec:該單元上次執行後,等多少時間再次執行
OnUnitInactiveSec: 定時器上次關閉後多少時間,再次執行
OnCalendar:基於絕對時間,而不是相對時間執行
AccuracySec:如果因為各種原因,任務必須推遲執行,推遲的最大秒數,預設是60秒
Unit:真正要執行的任務,預設是同名的帶有.service字尾的單元
Persistent:如果設定了該欄位,即使定時器到時沒有啟動,也會自動執行相應的單元
WakeSystem:如果系統休眠,是否自動喚醒系統

具體可以看官方文件

1.3. 刪除定時器

systemctl disable mytimer.timer #關閉開機啟動(即刪除目錄連結)
systemctl stop mytimer.timer # 關閉單元
systemctl stop mytimer.service

#之後刪除timer 和Service檔案

systemctl daemon-reload # 重新載入配置

參考

Systemd 定時器教程-阮一峰

相關文章