crontab定時任務不執行的一些原因總結



參考博文地址: https://www.jb51.net/article/154290.htm
聲明:本文章是在以上地址博文基礎上進行整理學習,如有侵權,請聯系博主刪除,感謝知識共享,一起進步,加油鴨

crontab定時任務不執行的5個原因:


1 crond服務未啟動
注意:我建議先自己在crontab -e中寫一個簡單的定時任務以檢查crond服務是否啟動着,如 00 13 * * * touch book.txt,然后檢查13點后是否創建了book.txt,如果沒有再檢查並啟動crond
crontab不是Linux內核的功能,而是依賴一個crond服務,這個服務可以啟動當然也可以停止。如果停止了就無法執行任何定時任務了,解決的方法是打開它:
crond

service crond start

如果提示crond命令不存在,可能被誤刪除了,CentOS下可以通過這個命令重新安裝:
yum -y install crontabs

 

2 權限問題
比如:腳本沒有x執行權限,解決方法:
增加執行權限,或者用bash abc.sh的方法執行
也有可能crontab任務所屬的用戶對某個目錄沒有寫權限,也會失敗.
我的疑惑:如果是這個原因,至少會報錯permission denied對吧?


3 路徑問題
有的命令在shell中執行正常,但是在crontab執行卻總是失敗。有可能是因為crontab使用的sh未正確識別路徑,比如:以root身份登錄shell后執行一個/root/test.sh,只要執行
就可以了。但是在crontab中,就會找不到這個腳本,建議寫完整:
這里就是常見的因寫相對路徑導致失敗的情況了,建議寫絕對路徑(我寫的絕對路徑啊......)

4 時差問題
因為服務器與客戶端時差問題,所以crontab的時間以服務器時間為准。
時差這個問題還真是搞人,這個我親身體驗了,現象如下:
(1) 我設置了一個定時腳本,用date命令觀察服務器的時間到了腳本執行的時間點,發現沒有執行
(2) 但是我把腳本設置成每分鍾執行一次,就是OK的
見鬼了,服務器時間是對的啊?莫非是要加個什么時區?於是把腳本的時間減10或者12或者8個小時都嘗試了下,發現都不行。
但是很明顯是時間不一致導致的不執行。
最后用如下兩行解決了問題:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart

參考這篇文章: https://www.jb51.net/article/154296.htm
我的不是這樣,定時任務肯定執行了,但是腳本沒跑起來......


5 變量問題
現象描述:確定執行了新增的定時任務,但是對應腳本沒有執行,也沒有在腳本制定了路徑下找到應該生成的日志文件
原因與解決:腳本中的日志路徑寫成了相對路徑,應該寫絕對路徑!
有時候命令中含有變量,但crontab執行時卻沒有,也會造成執行失敗。
驗證后,我的定時腳本test.sh不執行不是上述任何一種原因,其實我的腳本就一句話:
Code
#!/bin/bash
echo 123 >> testFile

我希望通過這種方式來測試 我設置的定時腳本起作用了,於是我設置了該腳本每分鍾執行一次,但是死活在腳本所在目錄看不到這個文件,我手動執行
卻能看到在腳本所在目錄能看到這個文件
我懷疑是crontab根本沒有執行,於是我在crontab中直接添加了
Code
*/1 * * * * echo 123 >> /home/denglinjie/testFile
testFile文件生成了,說明crontab是執行了的,那看來是我腳本自身存在問題
最后發現,原來是testFile這里必須寫完整的路徑,我天真的以為testFile會生成在腳本所在的目錄,所以改成了如下形式
Code
#!/bin/bash
echo 123 >> /data/denglinjie/testFile

然后就可以了。
其實路徑是個非常容易出問題的地方,假設在/home/denglinjie目錄下有一個腳本文件test1.sh,然后在該目錄下還有一個腳本文件test2.sh
在test1.sh中執行了test2.sh,而且用的是相對路徑,即相對test1.sh所在的路徑。
如果在crontab -e中編輯的時候,執行的方式是
sh /home/denglinjie/test1.sh,當執行到調用sh test2.sh的時候,系統會認為是從crontab文件所在的目錄去找test2.sh,但是其實是找不到的,造成執行失敗
最開始我想的方法是,我要將我寫的待執行的腳本文件以及被調用的其他的腳本和crontab文件放到一個地方,這樣就可以拉,但是失敗了,可能是因為權限問題,我進不去/var/spool/cron目錄。
所以另外一個解決方法就是在執行腳本之前先通過 cd /home/denglinjie 命令進入到腳本所在目錄
------------------------------------------------------------------
所以說我的是因為腳本中的路徑不是絕對路徑導致?再改一版試試
哈哈哈嗚嗚嗚,看來真是因為這個,好氣啊,以后看來腳本都得寫絕對路徑

最近又發現一種新的引起crontab不執行的原因
這里我要執行的是python腳本,我python腳本的目錄為:

Code

/data/denglinjie/work/UpdateModuleSwitch


一開始我的定時任務是這樣寫的:
Code

0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py

發現到了時間點居然沒有執行,其中update_switch.py的部分內容如下:
就是我的腳本中引入了自己安裝的pymongo, 注意,這個pymongo是安裝到了指定的python版本上的
不執行原因:crontab定時任務執行的時候,使用的python不是我的那個python,使用的這個python沒有安裝pymongo,導致import失敗
解決辦法,改成如下形式:
0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;/data/zhoumi/install_evn/bin/python update_switch.py
指定運行使用的python,這個python已經安裝綁定了pymongo,或者用如下形式:
0 * * * * export PATH=/data/zhoumi/install_evn/bin/:$PATH;cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py
因為我的這個python是安裝在我自己的用戶目錄下,所以系統找不到這個python,所以只要將我的python也加入到系統PATH環境變量中就可以了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM