1. 程式人生 > >Linux定時任務執行crontab

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,可以通過時間點,來找出執行失敗的原因。