Linux定時任務執行crontab
在Linux中,可以使用crontbab指定定時任務。
使用命令crontab -e即可編輯crontab,在裡面新增需要的定時任務。使用者的定時任務檔案為 /var/spool/cron/使用者名稱 ,crontab -e命令將相當於vim /var/spool/cron/使用者名稱。
1、如何寫crontab
crontab中每一行代表一個任務,每個任務由週期和任務名組成。如下形式
59 23 10 5 2014 /home/root/tesh.sh
#分 時 日 月 年 |<-------命令串------->|
表示2014年5月10日23點59分,執行/home/root下的tesh.sh指令碼。
時間週期中可以使用一些輔助字元,如:
* 表示任何時刻都可以
, 若有多個時刻,用逗號分隔
- 表示一個時刻到另一時刻之間的時間段
/n 表示每過n個時間單位
比如,*/10 3-6 10,11 * * /home/root/tesh.sh 就表示 每年每月的10號和11號,3點到6點之間,每過10分鐘執行一次tesh.sh
2、crontab註釋
在crontab中,#代表了註釋,註釋的存在,能夠簡化crontab的一些複雜操作。
比如,如果有一個任務test.sh,每天都需要執行,每過10分鐘執行一次,我們可以寫成 /10 * * * tesh.sh。現在有新要求,每天1點到1點10分不能執行,其餘時間照舊。
一種寫法就是:將它拆成多條crontab,比如每天2點到0點執行,每天0點到1點執行,每天1點10分到2點執行。三條語句。這種方法的問題就是,如果再來新的要求呢,比如在此基礎之上,每天8點到8點10分不能執行,這又怎麼處理,寫更多的crontab任務嗎?
另一種比較好的解決方案是:寫一個run.sh指令碼,每10分鐘執行一次,首先判斷當前時間是否是在1點到1點10分之間,如果不是,就執行tesh.sh,如果是,可以sleep10分鐘。
第三種非常好的方案就是利用註釋。我們可以在1點時,將tesh.sh任務給註釋掉,在1點10分,將tesh.sh任務的註釋消除。要實現這種想法,需要使用sed命令。可以在crontab裡面這樣寫:
#每隔10分鐘執行一次
*/10 * * * * tesh.sh
#每天1點鐘,將命令註釋掉
0 1 * * * sudo sed -i 's\%\(\*\/10 \* \* \* \* tesh.sh\)\%#\1\%' /var/spool/cron/使用者名稱
#每天1點零10分,將被註釋的命令恢復
10 1 * * * sudo sed -i 's\%\(^##*\)\(\*\/10 \* \* \* \* tesh.sh\)\%\2\%' /var/spool/cron/使用者名稱
sed -i表示直接修改檔案內容,之後的動作必須用單引號括上,單引號之後的是檔案。單引號內部s表示替換,s之後的%是分隔符,代替預設的/分隔符,括弧表示將括號裡面的內容儲存下來,標記為1,#表示把註釋擴充套件到下一個換行符以前,\1表示選取括號中的內容。
這裡出現了眾多的反斜槓,都是用來做轉義的,否則會被解析。
其中%前面的反斜槓是用來轉義crontab的,crontab中會將%解析成換行符。括弧和*前的反斜槓是因為sed會解析它們。
如果不是在crontab中,這個命令可以寫成 sed -i ‘s%*\/10****tesh.sh%#\1%’ file
3、crontab的除錯方式
如果crontab不執行,我們可以使用 sudo vim /var/spool/mail/使用者名稱檢視系統發給使用者的mail,可以通過時間點,來找出執行失敗的原因。