crontab

crontab

簡介

​ 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

關於crontab每小時運行一次

正確寫法: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 # 更加錯誤的寫法,分鐘要求的是每分鐘執行,而小時卻要求每小時執行,最終以分鐘爲準。所以每分鐘執行一次。

關於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的使用方法就這些啦,若有補充,歡迎評論區留言(●'◡'●)

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息