雖然linux定時任務很簡單,但是用起來還是有一些坑的,現在我從頭開始講講怎麼解決這些坑。
一、使用姿勢(來自於某個網站)
crontab的命令構成爲 時間+動作,其時間有分、時、日、月、周五種,操作符有
- * 取值範圍內的所有數字
- / 每過多少個數字
- - 從X到Z
- ,散列數字
實例
實例1:每1分鐘執行一次myCommand
* * * * * myCommand
實例2:每小時的第3和第15分鐘執行
3,15 * * * * myCommand
實例3:在上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * * myCommand
實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行
3,15 8-11 */2 * * myCommand
實例5:每週一上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * 1 myCommand
實例6:每晚的21:30重啓smb
30 21 * * * /etc/init.d/smb restart
實例7:每月1、10、22日的4 : 45重啓smb
45 4 1,10,22 * * /etc/init.d/smb restart
實例8:每週六、週日的1 : 10重啓smb
10 1 * * 6,0 /etc/init.d/smb restart
實例9:每天18 : 00至23 : 00之間每隔30分鐘重啓smb
0,30 18-23 * * * /etc/init.d/smb restart
實例10:每星期六的晚上11 : 00 pm重啓smb
0 23 * * 6 /etc/init.d/smb restart
實例11:每一小時重啓smb
* */1 * * * /etc/init.d/smb restart
實例12:晚上11點到早上7點之間,每隔一小時重啓smb
* 23-7/1 * * * /etc/init.d/smb restart
二、一些不爲人知的坑
- vi /etc/crontab 和crontab -e 是完全不一致的,vi /etc/crontab必須需要指定用戶來執行,vi /etc/crontab 需要用下面方法執行如:*/5 * * * * root php xxxxxx >/dev/null 2>&1
# Minute Hour Day of Month Month Day of Week Who Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) root /my/fancy/script.sh
- 新創建的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啓cron則馬上執行。
- 每條 JOB 執行完畢之後,系統會自動將輸出發送郵件給當前系統用戶。日積月累,非常的多,甚至會撐爆整個系統。所以每條 JOB 命令後面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job 中的命令需要正常輸出已經作了一定的處理, 比如追加到某個特定日誌文件。
- 當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。
- 千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。
- 在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的date ‘+%Y%m%d’在crontab裏是不會執行的,應該換成date ‘+\%Y\%m\%d’`
三、cli可以執行,但定時任務不執行,還有一個很重要的是環境變量的原因
解決方法:
需要在定時任務中加入
30 01 * * * apache source /etc/profile; php xxxxxx >/dev/null 2>&1
原因:
crontab與環境變量
不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll腳本中提供所有必要的路徑和環境變量,除了一些自動設置的全局變量。所以注意如下3點:
1)腳本中涉及文件路徑時寫全局路徑;
2)腳本執行要用到php或其他環境變量時,在腳本中引入通過source命令引入環境變量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
參考: