在平常的運維工做中,對crontab定時任務的制定是再尋常不過的了。根據以往的使用經驗梳理以下:php
基本格式 :
* * * * * command
分 時 日 月 周 命令
解釋:
第1列表示分鐘1~59 每分鐘用*或者 */1表示
第2列表示小時0~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6/7(0或7表示星期天)(或用Sun或Mon簡寫來表示)
第6列要運行的命令java
crontab -e 編輯計劃任務
crontab -l 查看計劃任務
crontab -u username -e 在username用戶下編輯計劃任務
crontab -u username -l 查看username下的計劃任務
crontab -u username -r 刪除某個用戶的計劃任務linux
全部用戶定義的crontab存儲在目錄/var/spool/cron下(能夠在這個目錄下直接編輯和刪除),任務會以建立者的身份被執行。要以特定用戶建立一個crontab,先以該用戶登陸,執行命令crontab -e(或者在root下執行crontab -u username -e)
crontab的日誌是/var/log/cronshell
實例以下:vim
0)每15分鐘和每30分鐘執行一次腳本
00,15,30,45 * * * * /bin/sh /root/autocheck.sh >/dev/null 2>&1
00,30 * * * * /bin/sh /root/testhe.sh >/dev/null 2>&1bash
1)每一分鐘執行/root/monit.sh這個腳本
* * * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
或者
*/1 * * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1服務器
每n分鐘執行一次
*/n * * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1oracle
2)每一小時執行/root/monit.sh這個腳本
10 * * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
上面的10能夠是任何一個數字,其實就是每一小時的第10分鐘,或者第n分鐘。運維
每n小時執行一次
n */n * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1ui
每兩小時執行一次
0 */2 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
23:00到7:00之間每隔2小時執行一次
0 23-7/2 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
23:00到8:00之間每隔1小時執行一次
0 23-8/1 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
3)每晚23:59分鐘執行
59 23 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
即天天的m點的n分鐘執行(也即天天執行一次,就是說天天的某個時候去執行就行)
n m * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
4)晚上11點到早上8點之間每兩個小時執行
0 23-8/2 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
天天的0點、6點、12點、18點各執行一次
0 0,6,12,18 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
11月分內,天天的早上6 點到12 點中,每隔2 小時執行一次
0 6-12/2 * 11 * /bin/bash -x /root/monit.sh > /dev/null 2>&1
5)每月的4號和每一個禮拜的禮拜一到禮拜三的早上11點執行
0 11 4 * 1-3 /bin/bash -x /root/monit.sh > /dev/null 2>&1
或者
0 11 4 * mon-wed /bin/bash -x /root/monit.sh > /dev/null 2>&1
6)1月1日早上4點執行
0 4 1 1 * /bin/bash -x /root/monit.sh > /dev/null 2>&1
7)每週日的4:30執行一次(也即每週執行一次)
30 4 * * 0 /bin/bash -x /root/monit.sh > /dev/null 2>&1
8) 每月的第一天的6:00執行一次(也即每個月執行一次)
0 6 1 * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
9)每個月的第一、十、22天的7:30執行一次
30 7 1,10,22 * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
10)每週6、周天的凌晨1:00執行
0 1 * * 6,0 /bin/bash -x /root/monit.sh > /dev/null 2>&1
11)每週一到週五的凌晨2:30執行
30 2 * * 1-5 /bin/bash -x /root/monit.sh > /dev/null 2>&1
12)天天18:00至23:0之間每隔30分鐘執行
0,30 18-23 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
或者
*/30 18-23 * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
13)每10秒鐘執行一次
* * * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 10;/bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 20;/bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 30;/bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 40;/bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 50;/bin/bash -x /root/monit.sh > /dev/null 2>&1
每20秒執行一次
* * * * * /bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 20;/bin/bash -x /root/monit.sh > /dev/null 2>&1
* * * * * sleep 40;/bin/bash -x /root/monit.sh > /dev/null 2>&1
每10秒鐘執行一次下面的php腳本(log記錄)
* * * * * php /home/fdipzone/php/crontab/tolog.php
* * * * * sleep 10;php /home/fdipzone/php/crontab/tolog.php
* * * * * sleep 20;php /home/fdipzone/php/crontab/tolog.php
* * * * * sleep 30;php /home/fdipzone/php/crontab/tolog.php
* * * * * sleep 40;php /home/fdipzone/php/crontab/tolog.php
* * * * * sleep 50;php /home/fdipzone/php/crontab/tolog.php
使用 tail -f 查看執行狀況,能夠見到log每10秒被寫入一條記錄。
tail -f /home/fdipzone/php/crontab/run.log
2. 2014-03-31 21:47:01
3. 2014-03-31 21:47:11
4. 2014-03-31 21:47:21
5. 2014-03-31 21:47:31
6. 2014-03-31 21:47:41
7. 2014-03-31 21:47:51
8. 2014-03-31 21:48:01
14) 在root帳號下編寫crontab -e計劃任務,以下分別在6:30,12:30,18:30,23:30時間點,切換到oracle用戶下執行腳本(固然也能夠直接在oracle帳號下編寫crontab -e計劃任務,若是不生效,就用這種方式)
30 6,12,18,23 * * * su - oracle -c "/bin/bash -x /oradata/script/oracl_data_bak.sh" >/dev/null 2>&1
有一臺內網服務器,經過squid代理上網。發如今這臺內網服務器設定的crontab計劃任務無效,沒有自動執行!
[root@wang-beta ~]# vim /etc/profile
.....
export HTTP_PROXY=http://192.168.1.199:3128
[root@wang-beta ~]# source /etc/profile
[root@wang-beta ~]# crontab -e
*/28 * * * * /bin/bash /root/sbin/list_update.sh > /dev/null 2>&1
發現上面制定的計劃任務,手動執行是生效的。可是crontab自動執行無效。
解決辦法:
自動執行無效的緣由是沒有加載上相關環境變量所致。
執行前,強制添加系統環境變量便可
[root@wang-beta ~]# crontab -e
*/28 * * * * source /etc/profile;/bin/bash /root/sbin/list_update.sh > /dev/null 2>&1
------------crontal定時執行失敗緣由總結----------- 1)腳本語法錯誤 在crontab腳本沒有定時執行的時候,首先須要檢查腳本的語法有沒有出現問題。 2)環境變量問題 有時建立了一個crontab,可是這個任務卻沒法自動執行,而手動執行這個任務卻沒有問題,這種狀況通常是因爲在crontab文件中沒有配置環境變量引發的。在手動執行任務時是在 當前shell環境下進行的,程序可以找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的。所以,須要在shelll腳本中提供全部必要的路徑和環境變量。 須要注意的主要有如下三點: -> 腳本中涉及文件路徑時寫全局路徑; -> 腳本執行要用到java或其餘環境變量時,經過source命令引入環境變量,如: #cat start_cbp.sh #!/bin/bash source /etc/profile export RUN_CONF=/home/work/conf/cbp_jboss.conf /usr/local/jboss/bin/run.sh -c mev & -> 當手動執行腳本OK,可是crontab死活不執行時,這時必須大膽懷疑是環境變量惹的禍,並能夠嘗試在crontab中直接引入環境變量解決問題。如: 0 * * * * . /etc/profile;/bin/bash -x /home/jira/bin/start_jira.sh 3)系統任務調度及用戶任務調度 系統任務調度主要完成系統的一些維護操做,用戶任務調度主要完成用戶自定義的一些任務,能夠將用戶任務調度放到系統任務調度來完成(不建議這麼作),可是反過來卻不行,root 用戶的任務調度操做能夠經過"crontab –uroot –e"來設置,也能夠將調度任務直接寫入/etc/crontab文件,須要注意的是,若是要定義一個定時重啓系統的任務,就必須將任務放到 /etc/crontab文件,即便在root用戶下建立一個定時重啓系統的任務也是無效的。 ------------crontab定時任務不執行解決辦法------------ 1)查看crontab執行記錄 若是出現了crontab定時任務不執行的狀況,首先須要定位問題,那麼就須要經過日誌來肯定問題所在。crontab日誌位置通常位於/var/log/cron,利用下面的語句便可查看日誌。 # tail -f /var/log/cron 上面的/var/log/cron只會記錄是否執行了某些計劃的腳本,可是具體執行是否正確以及腳本執行過程當中的一些信息linux會經過郵件形式發送到給該用戶。 對於root用戶該郵件記錄位於/var/spool/mail/root,經過如下命令能夠查看最近的crontab執行狀況。 # tail -f /var/spool/mail/root mail郵件通常只會記錄腳本執行成功與否,若是執行失敗,沒法給出進一步的錯誤信息,這時須要咱們將語句執行的錯誤信息重定向至文件中,這樣能夠很方便的查看錯誤信息。 下面就給出一個簡單的例子: 0 6 * * * /root/script/monit.sh >> /root/for_crontab/mylog.log 2>&1 上述語句表示把錯誤輸出和標準輸出都輸出到mylog.log中,在執行的時候會將命令執行的相關信息記錄至mylog.log文件中。 能夠重啓crond服務 # /etc/init.d/crond restart
將/var/spool/cron/root文件鎖定(chattr +ai /var/spool/cron/root),這樣,crontab在root用戶下就編輯不了(用戶的crontab定時任務執行文件都放在"/var/spool/cron/用戶")。
crontab服務的啓動:/etc/init.d/crond start/stop/restart/status