乾貨_先存着

crontab 配置文件

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

minutem      :  代表一小時內的第幾分,範圍 0-59。 
hour    h       :  代表一天中的第幾小時,範圍 0-23。 
mday  dom  :  代表一個月中的第幾天,範圍 1-31。 
monthmon  :   代表一年中第幾個月,範圍 1-12。 
wday  dow  :   代表星期幾,範圍 0-7 (0及7都是星期天)。 
who                    :   要使用什麼身份執行該指令,當您使用 crontab -e 時,不必加此字段。 
commandcommand所要執行的指令。 

 

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:007: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:01: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不執行的原因解析

Posted by 破冰 on 2013-8-25 13:40 Sunday

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等等其實都可以用上面的五段來設置.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章