SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# .—————- minute (0 – 59)
# | .————- hour (0 – 23)
# | | .———- day of month (1 – 31)
# | | | .——- month (1 – 12) OR jan,feb,mar,apr …
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR
#sun,mon,tue,wed,thu,fri,sat
# | | | | |
# m h dom mon dow command
# * * * * * command will be executed
例如:
*/5 * * * * root /usr/libexec/atrun
minute(m) : 代表一小時內的第幾分,範圍 0-59。
hour (h) : 代表一天中的第幾小時,範圍 0-23。
mday (dom) : 代表一個月中的第幾天,範圍 1-31。
month(mon) : 代表一年中第幾個月,範圍 1-12。
wday (dow) : 代表星期幾,範圍 0-7 (0及7都是星期天)。
who : 要使用什麼身份執行該指令,當您使用 crontab -e 時,不必加此字段。
command(command):所要執行的指令。
crond 開機啓動
crond 啓動/關閉腳本
/etc/init.d/crond help
Usage: /etc/init.d/crond {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
crond 加入到開機啓動
chkconfig --level 2345 crond on
crontab定時任務不執行問題
排查原因步驟如下:
首先,確認服務器是否開啓定時任務計劃服務,只有root用戶才能對crond服務進行開啓和關閉
[root@mimvp-bj script]# service crond status
crond is stopped
[root@mimvp-bj script]# service crond start
Starting crond: [ OK ]
[root@mimvp-bj script]# service crond status
crond (pid 24577) is running…
請確保crond狀態爲 is running…
如果crond狀態爲 crond is stopped ,則定時任務服務不會生效故無法執行,我遇到的crontab不執行就是這個原因
crontab 常見錯誤的幾個問題
編輯 crontab
:
crontab -e
(指定bash是非常有效的解決方式,我今天碰到這個問題,死活執行不起來,後臺調試過程中添加了這一句就解決了)
# minute hour day month week command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh
Ctrl + O (寫入)——》 Enter鍵(保存文件名)——》 Ctrl + X(退出)
輸入查看命令:
crontab -l
# m h dom mon dow command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推薦用此方式)
如果遇到shell語法錯誤
解決方法:
需指定shell解釋器命令:SHELL=/bin/bash(請參見上面 crontab編輯示例 SHELL=/bin/bash)
或者參見: LINUX – BASH Syntax Error
如果遇到路徑錯誤
在 /var/spool/crontab/yanggang 中,添加了如下命令,在日誌文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路徑
30 * * * * /home/barry/top800/top10/top10_fruits/top10_all.sh
或
30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh
這是因爲你在crontab中使用了絕對路徑執行腳本 top10_all.sh,因此在腳本 top10_all.sh 中引用的其它腳本也都需要使用絕對路徑,才能被crontab找到並執行。
那麼該如何避免絕對路徑呢,推薦採用如下格式:
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推薦用此方式)
先進入該目錄,然後在執行腳本;否則,執行腳本中的其它腳本都需要加絕對路徑
一些示例:
00 8,12,16 * * * /data/app/scripts/monitor/df.sh
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh
43 21 * * * 21:43 執行
15 05 * * * 05:15 執行
0 17 * * * 17:00 執行
0 17 * * 1 每週一的 17:00 執行
0,10 17 * * 0,2,3 每週日,週二,週三的 17:00和 17:10 執行
0-10 17 1 * * 毎月1日從 17:00到7:10 毎隔1分鐘 執行
0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 執行
42 4 1 * * 毎月1日的 4:42分 執行
0 21 * * 1-6 週一到週六 21:00 執行
0,10,20,30,40,50 * * * * 每隔10分 執行
*/10 * * * * 每隔10分 執行
* 1 * * * 從1:0到1:59 每隔1分鐘 執行
0 1 * * * 1:00 執行
0 */1 * * * 毎時0分 每隔1小時 執行
0 * * * * 毎時0分 每隔1小時 執行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 執行
30 5 1,15 * * 1日 和 15日的 5:30 執行
2.3 & 後臺執行命令
當在前臺運行某個作業時,終端被該作業佔據;而在後臺運行作業時,它不會佔據終端。可以使用&命令把作業放到後臺執行。
如:
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &
在後臺運行作業時要當心:需要用戶交互的命令不要放在後臺執行,因爲這樣你的機器就會在那裏傻等。
不過,作業在後臺運行一樣會將結果輸出到屏幕上,干擾你的工作。如果放在後臺運行的作業會產生大量的輸出,最好使用下面的方法把它的輸出重定向到某個文件中:
如:
command >out.file 2>&1 &
在這個例子中,2>&1表示所有的標準輸出和錯誤輸出都將被重定向到一個叫做out.file 的文件中。
crontab不執行的原因解析
1.Cron的啓動與關閉
由於Cron是Linux的內置服務,可以用以下的方法啓動.關閉這個服務:
/sbin/service crond start //啓動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啓服務
/sbin/service crond reload //重新載入配置
2.Cron配置文件
2.1全局配置文件
crontab在/etc目錄下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五個目錄和crontab,cron.deny二個文件.
cron.daily是每天執行一次的job,cron.weekly是每個星期執行一次的job.cron.monthly是每月執行一次的job,cron.hourly是每個小時執行一次的job.cron.d是系統自動定期需要做的任務,但是又不是按小時,按天,按星期,按月來執行的,那麼就放在這個目錄下面.
/etc/crontab文件一般如下:
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
我們可在此文件中添加自己需要的cron job.
/etc/cron.deny文件就是用於控制不讓哪些用戶使用Crontab的功能.
2.2用戶配置文件
每個用戶都有自己的cron配置文件,通過crontab -e 就可以編輯,一般情況下我們編輯好用戶的cron配置文件保存退出後,系統會自動就存放於/var/spool/cron/目錄中,文件以用戶名命名.
linux的cron服務是每隔一分鐘去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的內容.
3.Cron命令格式
crontab [ -u user ] 文件
crontab [ -u user ] { -l | -r | -e }
-u:指定某一用戶
-e:執行文字編輯器來設定用戶(當前用戶或指定用戶)時程表,內定的文字編輯器是vi.
-r:刪除用戶時程表.
-l:列出用戶時程表.
4.Cron文件格式
* * * * * command
分 時 日 月 周 命令
第1列表示分鐘1~59, 每分鐘用*或者 */1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令
5.Cron文件使用說明
5.1 一般情況
當f1 爲 * 時表示每分鐘都要執行 program,f2 爲 * 時表示每小時都要執行程序,其餘類推.
* * * * * /bin/usershell 每天每分鐘執行一次/bin/usershell
當f1 爲 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 爲 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推.
0-12 * * * * /bin/usershell 每天每小時從0到12分鐘每分鐘執行一次/bin/usershell
當f1 爲 */n 時表示每 n 分鐘個時間間隔執行一次,f2 爲 */n 表示每 n 小時個時間間隔執行一次,其餘類推.
* */2 * * * /bin/usershell 每天每2小時執行一次/bin/usershell
當f1 爲 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 爲 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推.
* 1,3,5,7 * * * /bin/usershell 每天每逢1,3,4,7點執行一次/bin/usershell
5.2. 衝突邏輯
日期可以用月限定,也可以用“星期”指定,如果兩個段有衝突,那麼,第六段的命令將在匹配任何一個的情況下都運行,比如
"30 4 1,15 * 5",將在每月的1號和15號加每個週五,上午4:30運行.
5.3. 符號"%"
"%"在Cron文件中,有"結束命令行","換行","重定向"的作用,假如不需要"%"的特殊作用,需要使用轉義符轉義.
5.4. @reboot
這個不需要理解,爲了達到在開機後運行,且只運行一次的目的.除了這個,也無法通過前五段的設置來實現.
@annually也是這個功能.
至於@yearly,@monthly等等其實都可以用上面的五段來設置.