使用cron進行排程
crontab命令常見於Unix和類Unix的作業系統之中,用於設定週期性被執行的指令。該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。該詞來源於希臘語chronos(χρόνος),原意是時間。
通常,crontab儲存的指令被守護程序啟用,crond常常在後臺執行,每一分鐘檢查是否有預定的作業需要執行。這類作業一般稱為cron jobs。crontab檔案
crontab檔案包含送交cron守護程序的一系列作業和指令。每個使用者可以擁有自己的crontab檔案;同時,作業系統儲存一個針對整個系統的crontab檔案,該檔案通常存放於/etc或者/etc之下的子目錄中,而這個檔案只能由系統管理員來修改。
crontab檔案的每一行均遵守特定的格式,由空格或tab分隔為數個領域,每個領域可以放置單一或多個數值。操作符號
在一個區域裡填寫多個數值的方法:
逗號(',')分開的值,例如:“1,3,4,7,8”
連詞符('-')指定值的範圍,例如:“1-6”,意思等同於“1,2,3,4,5,6”
星號('*')代表任何可能的值。例如,在“小時域”裡的星號等於是“每一個小時”,等等
某些cron程式的擴充套件版本也支援斜線('/')操作符,用於表示跳過某些給定的數。例如,“*/3”在小時域中等於“0,3,6,9,12,15,18,21”等被3整除的數;時間設定
# 檔案格式說明 #——分鐘(0 - 59) # |——小時(0 - 23) # | |——日(1 - 31) # | | |——月(1 - 12) # | | | |——星期(0 - 7,星期日=0或7) # | | | | | # * * * * * 被執行的命令 注: 在“星期域”(第五個域),0和7都被視為星期日。 不很直觀的用法:如果日期和星期同時被設定,那麼其中的一個條件被滿足時,指令便會被執行。請參考下例。 前5個域稱之分時日月周,可方便個人記憶。 從第六個域起,指明要執行的命令。
例子
AIX系統管理員的Crontab檔案 #================================================================= #SYSTEM ACTIVITY REPORTS #8am-5pm activity reports every 20 mins during weekdays. #activity reports every hour on Saturday and Sunday. #6pm-7am activity reports every hour during weekdays. #summary prepared at 18:05 every weekday. #================================================================= 0,20,40 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 & 0 * * * 0,6 /usr/lib/sa/sa1 & 0 18-7 * * 1-5 /usr/lib/sa/sa1 & 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 3600 -ubcwyaqvm &
常見錯誤
一個常見的錯誤是,命令列雙引號中使用%時,未加反斜線\,例如:
錯誤的例子:
1 2 3 4 5 touch ~/error_`date "+%Y%m%d"`.txt 在守護程序發出的電子郵件中會見到錯誤訊息: /bin/sh: unexpected EOF while looking for `'''''''
正確的例子:
1 2 3 4 5 touch ~/right_$(date +\%Y\%m\%d).txt
使用單引號也可以解決問題:
1 2 3 4 5 touch ~/error_$(date '+%Y%m%d').txt
使用單引號就不用加反斜線了。這個例子會產生這樣一個檔案~/error_\2006\04\03.txt
1 2 3 4 5 touch ~/error_$(date '+\%Y\%m\%d').txt
下例是另一個常見錯誤:
59 1 1-7 4 0 /root/shift_my_times.sh
初看似要在四月的第一個星期日早晨1時59分執行shift_my_times.sh,但是這樣設定不對。
特殊地,當星期域(第五個域)被指定為 "*" 時,星期域與日域(第三個域)執行“與”操作;而當星期域(第五個域)被指定為 * 以外的內容時,星期域與日域執行“或”操作。 所以這個程式會在4月1日至7日以及4月餘下的每一個星期日執行。
另一個常見錯誤是對分鐘設定的誤用。下例欲一個程兩個小時執行一次:
* 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
而上述設定會使該程式在偶數小時內的每一分鐘執行一次。正確的設定是:
0 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
更好的方法:
0 */2 * * * date >> /var/log/date.log
不傳送電子郵件
如果輸出結果來自crontab裡的命令,那麼cron守護程序會用電子郵件將它發給使用者。
若想關閉某個命令的輸出結果,可以將輸出結果重定向至/dev/null。>/dev/null 2>&1
在常用的Vixie cron中,也可以在檔案的開始部分加入命令來關閉所有命令的郵件輸出:
MAILTO=""