crontab常見於Unix和類Unix的操做系統之中,用於設置週期性被執行的指令。編輯好的crontab會被存放於「crontab」文件中,以供以後讀取和執行。每一個用戶能夠擁有本身的crontab文件。一般,crontab存儲的指令被守護進程crond激活,crond經常在後臺運行,每分鐘檢查是否有預約的做業須要執行。sql
(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
示例:shell
(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)下面例子與上面的例子效果同樣code
59 23 * * 1-5 /root/bin/hello.sh
(4)每5分鐘運行一次進程
*/5 * * * * /root/bin/hello.sh
(5)每月的第一天1:10pm運行crontab
10 13 1 * * /root/bin/hello.sh
(6)每一個工做日11:00pm運行ip
0 23 * * 1-5 /root/bin/hello.sh
正確寫法:io
*/60 * * * * /root/bin/hello.sh
如下均爲錯誤寫法:class
0 * * * * /root/bin/hello.sh # 每小時的0分運行。雖然也是每小時運行一次,可是若是我是在10:20建立crontab,應該在11:20運行,而不是11:00
0 */1 * * * /root/bin/hello.sh # 和上面同樣
* */1 * * * /root/bin/hello.sh # 更加錯誤的寫法,分鐘要求的是每分鐘執行,而小時卻要求每小時執行,最終以分鐘爲準。所以每分鐘執行一次。
在簡介中有提到過,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,可是因爲sql查詢速度和網絡延遲等狀況,可能上一次的外發尚未執行完,下一次的外發就開始了,致使有些告警被重複外發。這裏就可使用flock來解決這個問題。
flock的本質是給某個crontab加鎖,若是第二個進程發現這個crontab有鎖,就會放棄執行。
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的使用方法就這些啦,若有補充,歡迎評論區留言(●'◡'●)