如何對失敗的 cron 作業進行故障排除
我有一個
crontab
root
看起來像這樣的文件:lab-1:/var/www/cdd# crontab -l # do daily/weekly/monthly maintenance # min hour day month weekday command * * * * * /etc/scripts/script1 */15 * * * * /etc/scripts/script2 0 * * * * /etc/scripts/script3
我可以看到所有作業都是通過執行以下命令觸發的:
lab-1:/var/www/cdd# cat /var/log/messages | grep cron.info Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26217 cmd /etc/scripts/script2 Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26219 cmd /etc/scripts/script3 Mar 15 13:01:00 lab-1 cron.info crond[7897]: USER root pid 26293 cmd /etc/scripts/script1
問題是 script3(我已經證明 script2 和 script1 工作)實際上並沒有產生預期的輸出。它應該在另一個文件夾中創建文件。但是,當我像這樣手動執行它時,它工作得很好:
lab-1:/etc/scripts# bash script3
我不是真正的系統管理員,所以不太確定解決此問題的最佳方法是什麼。
首先想到的是權限。
lab-1:/etc/scripts# ls -lah total 24 drwxr-xr-x 2 root root 4.0K Mar 15 12:20 . drwxr-xr-x 34 root root 4.0K Mar 14 17:11 .. -rwxr-xr-x 1 root root 5.0K Mar 15 12:19 script3 -rwxr-xr-x 1 root root 1.8K Mar 14 15:26 script1 -rwxr-xr-x 1 root root 1.9K Mar 14 15:26 script2
雖然…話雖如此,但如果是權限問題,它甚至會在我的
/var/log/messages
文件中顯示為被觸發/啟動嗎?我應該如何進行?
編輯 1
lab-1:/etc/scripts# ./script3 | head -n 4 Working folder set to: /tmp/tmp.kOfhip *****Grab SQL Data from Remote Server: spp.mydomain.net ***** COPY 344 Warning: Permanently added 'spp.mydomain.net,10.1.1.1' (ECDSA) to the list of known hosts. Evaluate /tmp/tmp.kOfhip/spp.mydomain.net.db lab-1:/etc/scripts#
編輯 2
這是我的腳本的樣子:
https://paste.pound-python.org/show/90vAlrOsAYP0CtYqNWfl/
如您所見,我正在創建一個臨時文件夾並在其中完成所有工作。
編輯 3
為了向自己證明這不是因為第 9 行這樣的行,我已經註釋掉了除第 1 行到第 15 行之外的所有內容。我添加了第 16 行來執行此操作:
echo "done" >> /tmp/results.txt
然後我將作業的時間表從一小時改為每兩分鐘執行一次。我可以看到它已經執行了 3 次。我想我會繼續這種方法,直到我發現一些不起作用/爆炸的東西。我不太明白下面關於使用 PATH 變數的評論……但我想我會用Google搜尋它。
編輯 4
我更改了 crontabs 根文件,因此它將 script3 的結果輸出到文件中,這就是我所看到的:
Working folder set to: /tmp/tmp.GeNGDJ *****Grab SQL Data from Remote Server: servername ***** COPY 344 Warning: Permanently added 'spp.mydomain.net,10.1.1.132' (ECDSA) to the list of known hosts. Permission denied (publickey,keyboard-interactive). Evaluate /tmp/tmp.GeNGDJ/spp.mydomain.net.db cat: can't open '/tmp/tmp.GeNGDJ/spp.mydomain.net.db': No such file or directory
所以它在嘗試 scp 文件時死了。遠端 SQL 執行良好並顯示輸出。但是正如您所看到的,我得到了一個權限被拒絕但是如果我手動執行相同的命令,它似乎可以工作。將不得不繼續四處尋找。將嘗試像下面的答案中建議的那樣轉儲 ENV。
編寫稍後將由 cron 執行的腳本時的一個常見錯誤是,您假設腳本將具有與您登錄並開發它時完全相同的環境。它沒有!
編寫一個包含以下行的腳本4
OFILE=/tmp/crons.environment (/usr/bin/whoami /usr/bin/env ) > $OFILE 2>&1
並讓 cron 執行它
現在將 /tmp/crons.environment 中的輸出與您輸入時得到的結果進行比較
env
例如,您的腳本假設 $PATH 已正確設置以查找您執行的所有程序,您還在查詢數據庫,這些命令可能需要進一步的環境變數才能正確執行。
檢查 cron 作業的輸出。臨時修改 cron 執行的命令並將 stdout 和 stderr 重定向到已知文件,就像我上面所做的那樣。
0 * * * * /etc/scripts/script3 > /tmp/s3.out 2>&1