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

2022-05-14 18:02:25 字數 3668 閱讀 1423

前言

最近在工作中遇到了一些問題,crontab定時任務居然不執行,後來我在網上找的時候發現網上主要說了這5個原因:

1 crond服務未啟動

crontab不是linux核心的功能,而是依賴乙個crond服務,這個服務可以啟動當然也可以停止。如果停止了就無法執行任何定時任務了,解決的方法是開啟它:

1crond或1

service crond start

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

1yum -yinstallcrontabs

2 許可權問題

比如:指令碼沒有x執行許可權,解決方法:

增加執行許可權,或者用bash abc.sh的方法執行

也有可能crontab任務所屬的使用者對某個目錄沒有寫許可權,也會失敗

3 路徑問題

有的命令在shell中執行正常,但是在crontab執行卻總是失敗。有可能是因為crontab使用的sh未正確識別路徑,比如:以root身份登入shell後執行乙個/root/test.sh,只要執行

1./test.sh

就可以了。但是在crontab中,就會找不到這個指令碼,比如寫完整:

1/root/test.sh

4 時差問題

因為伺服器與客戶端時差問題,所以crontab的時間以伺服器時間為準。

時差這個問題還真是搞人,這個我親身體驗了,現象如下:

(1) 我設定了乙個定時指令碼,用date命令觀察伺服器的時間到了指令碼執行的時間點,發現沒有執行

(2) 但是我把指令碼設定成每分鐘執行一次,就是ok的

見鬼了,伺服器時間是對的啊?莫非是要加個什麼時區?於是把指令碼的時間減10或者12或者8個小時都嘗試了下,發現都不行。

但是很明顯是時間不一致導致的不執行。

最後用如下兩行解決了問題:12

cp/usr/share/zoneinfo/asia/shanghai/etc/localtime

service crond restart

參考這篇文章: 

5 變數問題

有時候命令中含有變數,但crontab執行時卻沒有,也會造成執行失敗。

驗證後,我的定時指令碼test.sh不執行不是上述任何一種原因,其實我的指令碼就一句話:12

#!/bin/bash

echo123 >> testfile

我希望通過這種方式來測試 我設定的定時指令碼起作用了,於是我設定了該指令碼每分鐘執行一次,但是死活在指令碼所在目錄看不到這個檔案,我手動執行

1# sh test.sh

卻能看到在指令碼所在目錄能看到這個檔案

我懷疑是crontab根本沒有執行,於是我在crontab中直接新增了

1*/1* * * *echo123 >>/home/denglinjie/testfile

testfile檔案生成了,說明crontab是執行了的,那看來是我指令碼自身存在問題

最後發現,原來是testfile這裡必須寫完整的路徑,我天真的以為testfile會生成在指令碼所在的目錄,所以改成了如下形式12

#!/bin/bash

echo123 >>/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指令碼的目錄為:

1/data/denglinjie/work/updatemoduleswitch

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

10 * * * *cd/data/denglinjie/work/updatemoduleswitch;python update_switch.py

發現到了時間點居然沒有執行,其中update_switch.py的部分內容如下:

1importpymongo

就是我的指令碼中引入了自己安裝的pymongo, 注意,這個pymongo是安裝到了指定的python版本上的

不執行原因:crontab定時任務執行的時候,使用的python不是我的那個python,使用的這個python沒有安裝pymongo,導致import失敗

解決辦法,改成如下形式:

10 * * * *cd/data/denglinjie/work/updatemoduleswitch;/data/zhoumi/install_evn/bin/pythonupdate_switch.py

指定執行使用的python,這個python已經安裝繫結了pymongo,或者用如下形式:

10 * * * *exportpath=/data/zhoumi/install_evn/bin/:$path;cd/data/denglinjie/work/updatemoduleswitch;python update_switch.py

因為我的這個python是安裝在我自己的使用者目錄下,所以系統找不到這個python,所以只要將我的python也加入到系統path環境變數中就可以了

總結

crontab定時任務不執行的原因

檢視所有使用者下的定時任務 foruin cat etc passwd cut d f1 do crontab l u u done 網上主要說了這5個原因 1 crond服務未啟動 crontab不是linux核心的功能,而是依賴乙個crond服務,這個服務可以啟動當然也可以停止。如果停止了就無法...

crontab定時任務不執行的解決辦法

如果出現了crontab定時任務不執行的情況,首先需要定位問題,那麼就需要通過日誌來確定問題所在。crontab的日誌位置一般位於 var log cron,利用下面的語句即可檢視日誌。1tail f var log cron 上面的 var log cron只會記錄是否執行了某些計畫的指令碼,但是...

定時任務Crontab命令 執行批量定時任務

crontab r 刪除目前的時程表 crontab l 列出目前的時程表 crontab file u user 用指定的檔案替代目前的crontab command 要執行的命令 5個星的含義分別是 第乙個 表示分鐘,1 59,每分鐘可以用 和 1表示 第二個 表示小時,0 23 第三個 表示日...