crontab 簡介 crontab常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。編輯好的crontab會被存放於“crontab”文件中,以供之後讀取和執行。每個用戶可以擁有自己的crontab文件。通常,crontab存儲的指令被守護進程crond激活,crond常常 ...
crontab
簡介
crontab常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。編輯好的crontab會被存放於“crontab”文件中,以供之後讀取和執行。每個用戶可以擁有自己的crontab文件。通常,crontab存儲的指令被守護進程crond激活,crond常常在後臺運行,每分鐘檢查是否有預定的作業需要執行。
命令選項
(1) crontab -e : 修改crontab文件。如果文件不存在會自動創建
(2) crontab -l : 顯示crontab文件。
(3) crontab -r : 刪除crontab文件。
(4) crontab -ir : 刪除crontab文件前提醒用戶
語法
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
minute: 區間為0-59
hour: 區間為0-23
day-of-month: 區間為0-31
month: 區間為1-12,1是1月,12是12月
day-of-week: 區間為0-7,周日可以是0或7
示例:
(1)在每天00:01運行,即每天凌晨過一分鐘。
1 0 * * * /root/bin/hello.sh
(2)每個工作日(Mon - Fri)11:59PM運行
59 23 * * 1,2,3,4,5 /root/bin/hello.sh
(3)下麵例子與上面的例子效果一樣
59 23 * * 1-5 /root/bin/hello.sh
(4)每5分鐘運行一次
*/5 * * * * /root/bin/hello.sh
(5)每個月的第一天1:10pm運行
10 13 1 * * /root/bin/hello.sh
(6)每個工作日11:00pm運行
0 23 * * 1-5 /root/bin/hello.sh
關於crontab每小時運行一次
正確寫法:
*/60 * * * * /root/bin/hello.sh
以下均為錯誤寫法:
0 * * * * /root/bin/hello.sh # 每小時的0分運行。雖然也是每小時運行一次,但是如果我是在10:20創建crontab,應該在11:20運行,而不是11:00
0 */1 * * * /root/bin/hello.sh # 和上面一樣
* */1 * * * /root/bin/hello.sh # 更加錯誤的寫法,分鐘要求的是每分鐘執行,而小時卻要求每小時執行,最終以分鐘為準。因此每分鐘執行一次。
關於crontab每秒運行一次
在簡介中有提到過,crond守護進程每分鐘檢查一次是否有預定的作業需要執行,因此crontab沒有辦法直接做到每秒運行一次,最少每分鐘運行一次。但是我們可以通過增加sleep語句來達到每秒執行的效果。
以每30s執行一次為例:
* * * * * /root/bin/hello.sh
* * * * * sleep 30; /root/bin/hello.sh
第二條crontab雖然與第一條同時被crond執行,但是需要延遲30s,通過延遲執行的方式達到了每30s執行一次的效果
同理,每10s執行一次:
* * * * * /root/bin/hello.sh
* * * * * sleep 10; /root/bin/hello.sh
* * * * * sleep 20; /root/bin/hello.sh
* * * * * sleep 30; /root/bin/hello.sh
* * * * * sleep 40; /root/bin/hello.sh
* * * * * sleep 50; /root/bin/hello.sh
如果要達到每秒執行一次,則需要添加60條crontab,這裡就不贅述,留給大家自己思考叭(◕‿◕✿)
對於crontab任務堆積的處理
crontab在執行的過程中,可能由於任務執行錯誤或者在下一個任務開始前,前一個任務沒有執行完成,導致大量的進程產生,最終可能導致死機等情況產生。
之前做過一個告警外發的需求,要求實時的把最新告警給外發出去。這裡我用的就是crontab,但是由於sql查詢速度和網路延遲等情況,可能上一次的外發還沒有執行完,下一次的外發就開始了,導致有些告警被重覆外發。這裡就可以使用flock來解決這個問題。
flock的本質是給某個crontab加鎖,如果第二個進程發現這個crontab有鎖,就會放棄執行。
flock命令選項
flock [-sxon][-w #] file [-c] command
-s, --shared: 獲得一個共用鎖
-x, --exclusive: 獲得一個獨占鎖
-u, --unlock: 移除一個鎖,通常是不需要的,腳本執行完會自動丟棄鎖
-n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待
-w, --timeout: 如果沒有立即獲得鎖,等待指定時間
-o, --close: 在與逆行命令前關閉文件的描述符號,用於如果命令產生子進程時會不受鎖的管控
-c, --command 在shell中運行一個單獨的命令
-h, --help 顯示幫助
-V, --version 顯示版本
任務舉例:
# hello.lock為是一個鎖臨時文件
* * * * * flock -xn /root/bin/hello.lock -c '/root/bin/hello.sh'
* * * * * sleep 30; flock -xn /root/bin/hello.lock -c '/root/bin/hello.sh'
好啦,關於crontab的使用方法就這些啦,如有補充,歡迎評論區留言(●'◡'●)