Bash

如何對失敗的 cron 作業進行故障排除

  • March 15, 2018

我有一個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

引用自:https://unix.stackexchange.com/questions/430394