1. 程式人生 > >CentOS crontab定時任務不執行的解決

CentOS crontab定時任務不執行的解決

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 crond on

crontab定時任務不執行問題

排查原因步驟如下:

首先,確認伺服器是否開啟定時任務計劃服務,只有root使用者才能對crond服務進行開啟和關閉

[[email protected] script]# service crond status
crond is stopped
[[email protected] script]# service crond start
Starting crond:                                            [  OK  ]
[[email protected] script]# 
service crond status
crond (pid  24577) is running…

請確保crond狀態為 is running… 

如果crond狀態為 crond is stopped ,則定時任務服務不會生效故無法執行,我遇到的crontab不執行就是這個原因

crontab 常見錯誤的幾個問題

編輯 crontab :
crontab -e

# m h  dom mon dow   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語法錯誤

<code style="padding: 0px; margin: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102); border: 0px; vertical-align: baseline;"><span class="typ" style="padding: 0px; margin: 0px;">Syntax</span></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0); border: 0px; vertical-align: baseline;"><span class="pln" style="padding: 0px; margin: 0px;"> error</span></span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0); border: 0px; vertical-align: baseline;"><span class="pun" style="padding: 0px; margin: 0px;">:</span></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0); border: 0px; vertical-align: baseline;"><span class="pln" style="padding: 0px; margin: 0px;"> </span></span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0); border: 0px; vertical-align: baseline;"><span class="str" style="padding: 0px; margin: 0px;">"("</span></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0); border: 0px; vertical-align: baseline;"><span class="pln" style="padding: 0px; margin: 0px;"> unexpected  </span></span></code>

解決方法:

需指定shell直譯器命令:SHELL=/bin/bash(請參見上面 crontab編輯示例SHELL=/bin/bash

如果遇到路徑錯誤

在 /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推薦用此方式

先進入該目錄,然後在執行指令碼;否則,執行指令碼中的其它指令碼都需要加絕對路徑
原文:http://blog.mimvp.com/2015/03/centos-crontab-task-does-not-regularly-perform-solution/