您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何解決Linux中crontab定時任務未執行的錯誤,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
crontab 就是一個定時任務了。但有一些網友配置好crontab后發現第二天起來沒有執行指定任務了,那么這個問題有權限,限制等等原因,我們來給各位總結一下關于crontab不執行的解決辦法。
沒有按照規范寫以下的shell腳本導致執行失敗通過CentOS中的定時任務執行shell腳本失敗,進行排查:
1)手動執行shell腳本(sh backup.sh)成功執行,排除sh腳本的語法錯誤。
2)通過nano /etc/crontab命令查看定時任務,發現除過執行sh的定時任務外,其他任務都能正常執行。檢查其代碼,
發現對SHELL、PATH、MAILTO、HOME還沒有好好了解過,以往都是注意下面的時間規則,所以查了一下定義:
1)SHELL,變量的值指定shell 環境(此處默認為 bash shell);
2)PATH,變量定義用來執行命令的程序路徑;
3)MAILTO,任務的輸出被郵寄給 MAILTO 變量定義的用戶名,如果變量被定義為空白字符串,電子郵件就不會被寄出;
4)HOME,變量可以用來設置在執行命令或腳本時使用的主目錄;
隨后看到SHELL的定義先用env一下看一下系統默認shell是哪個地址,
[root@AY data]# env
HOSTNAME=AY
TERM=xterm
SHELL=/bin/bash
...
隨后打開shell腳本查看,果然沒有對shell腳本配置地址。好了,找到了一個問題,下面就根據文檔說明在shell腳本開始的地方打上該shell地址,如我的env是SHELL=/bin/bash,那么shell腳本開始就應該如下:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
添加完后重啟服務service crond restart,檢查腳本運行情況,順利執行~
這次是按排除法檢查了錯誤原因,主要還是由于沒有按照規范寫下的shell腳本導致執行失敗。
下面再列出幾個常見的沒有按規范編寫shell會出現的問題:
1)由于啟動腳本用的是系統的crontab所以必須定義sh文件的目錄以及具體日志的具體路徑
2)注意使用加減法使用((num=$line+1))兩個括號來進行弱類型轉換
3)注意if判斷大小于使用[[]]來進行,例如:if [[ $count > 0 ]],等于則可以使用一個[]即可
問題解決思路:
1. 判斷crontab是否有執行過,你可以添加一個每分鐘執行的寫文件的小腳本進行測試,如果有記錄說明crontab本身服務沒有問題.
如: Feb 7 14:45:01 1280859075761a8Z crond[13638]: (root) CMD (/backuptoqiniu/backuptoqiniu.sh )這里面應該是表示crontab已經成功執行了的,所以crontab服務沒有問題.
2. 其實有經驗多半就會知道crontab的執行是沒有相關環境變量的,解決辦法就是在腳本中打日志,另外默認將所有的命令采用全路徑的方式.
調試方法:添加日志文件,將原來所有的echo 全部可以嘗試追加到日志文件,或者在crontab寫的時候追加日志.
45 14 * * * /backuptoqiniu/backuptoqiniu.sh >> /tmp/out.log 2>&1
ases.sql" -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS $DATEBASE > "$NOW-Datab
我就沒有看懂你這個是什么,是不是自己的命令不在默認的系統命令里面.
測試方法: 測試crontab的PATH與手動執行的PATH不一樣.
可以在crontab的腳本里面添加個echo $PATH > /tmp/1.log
對比和你手動的終端下執行的echo $PATH
方法三,再看一個例子
crontab定時任務不執行的原因1、腳本語法錯誤在crontab腳本沒有定時執行的時候,首先需要檢查腳本的語法有沒有出現問題。
2、環境變量問題有時我們創建了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題,這種情況一般是由于在crontab文件中沒有配置環境變量引起的。我們在手動執行任務時是在當前shell環境下進行的,程序能夠找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的。因此,我們需要在shelll腳本中提供所有必要的路徑和環境變量。
需要注意的主要有以下三點:
1)腳本中涉及文件路徑時寫全局路徑;
2)腳本執行要用到java或其他環境變量時,通過source命令引入環境變量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)當手動執行腳本OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,并可以嘗試在crontab中直接引入環境變量解決問題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
3、系統任務調度及用戶任務調度系統任務調度主要完成系統的一些維護操作,用戶任務調度主要完成用戶自定義的一些任務,可以將用戶任務調度放到系統任務調度來完成(不建議這么做),但是反過來卻不行,root用戶的任務調度操作可以通過“crontab –uroot –e”來設置,也可以將調度任務直接寫入/etc/crontab文件,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab文件,即使在root用戶下創建一個定時重啟系統的任務也是無效的。
crontab定時任務不執行的解決辦法
1、查看crontab執行記錄如果出現了crontab定時任務不執行的情況,首先需要定位問題,那么就需要通過日志來確定問題所在。
crontab的日志位置一般位于/var/log/cron,利用下面的語句即可查看日志。
tail -f /var/log/cron
上面的/var/log/cron只會記錄是否執行了某些計劃的腳本,但是具體執行是否正確以及腳本執行過程中的一些信息linux會通過郵件形式發送到給該用戶。
對于root用戶該郵件記錄位于/var/spool/mail/root,通過以下命令可以查看最近的crontab執行情況。
tail -f /var/spool/mail/root
mail郵件一般只會記錄腳本執行成功與否,如果執行失敗,無法給出進一步的錯誤信息,這時需要我們將語句執行的錯誤信息重定向至文件中,這樣可以很方便的查看錯誤信息。下面就給出了一個簡單的例子
0 6 * * * /root/script/ss.sh >> /root/for_crontab/mylog.log 2>&1
上述語句表示把錯誤輸出和標準輸出都輸出到mylog.log中,在執行的時候會將命令執行的相關信息記錄至mylog.log文件中。
2、解決問題在經過上一步的問題定位之后,就可以很容易找到問題并解決。
上述內容就是如何解決Linux中crontab定時任務未執行的錯誤,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。