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 # 重新載入配置