1. 如何創建一個定時任務,通過systemd系統 <! TOC "1. 如何創建一個定時任務,通過systemd系統" "1.1. systemd中的timer" "1.2. 自定義定時任務" "1.2.1. 具體步驟" "1.2.2. [Timer]區塊屬性詳情" "1.3. 刪除定時器" <! ...
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 # 重新載入配置