crontab失敗的解決過程

531968912發表於2016-06-23

1.問題描述:
在使用crontab定時執行釋出包sql指令碼解析工作時,出現了一個奇怪的問題,
指令碼執行到生成release_xxxx.tmp檔案就終止執行了,且release_xxxx.tmp
檔案是空的。但是以同樣的方式手動執行dbmisProject.sh指令碼卻可以正常執行。

2.解決辦法
將crontab的輸出結果重定向到一個日誌檔案中,以記錄crontab執行的過程中發生了什麼錯誤。
(1)修改現有的crontab任務
0 3 * * 4 sh /home/dbmisTool/bin/dbmisProject.sh > /dev/null 2>&1

0 3 * * 4 sh /home/dbmisTool/bin/dbmisProject.sh > /tmp/dbmisProject.log 2>&1
這樣,只要在週四檢視dbmisProject.log檔案即知道crontab任務失敗的原因了。


(2)週四檢視dbmisProject.log中的內容如下:
/home/dbmisTool/bin/dbmisProject.sh: line 118: svn: command not found
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
/home/dbmisTool/bin/dbmisProject.sh: line 185: sqlplus: command not found
cat: /home/dbmisTool/tmp/report_20091126.txt: No such file or directory
Null message body; hope that's ok
原來是環境變數的問題,crontab在執行的時候只會定義少數環境變數而不是繼承使用者shell環境中的環境變數。因為svn: command not found和sqlplus: command not found說明找不到命令,其實是找不到這兩個命令對應的可執行檔案所在的目錄。

(3)在指令碼中新增了source /root/.bash_profile命令,在crontab執行指令碼時將root使用者的環境變數載入進去。
發現dbmisProject.log中的報錯資訊已經由
/home/dbmisTool/bin/dbmisProject.sh: line 118: svn: command not found
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
/home/dbmisTool/bin/dbmisProject.sh: line 185: sqlplus: command not found
cat: /home/dbmisTool/tmp/report_20091126.txt: No such file or directory
Null message body; hope that's ok
變為
/home/dbmisTool/bin/dbmisProject.sh: line 123: svn: command not found
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
ls: /disk2/db_release: No such file or directory
cat: /home/dbmisTool/tmp/report_20091203.txt: No such file or directory
Null message body; hope that's ok

即sqlplus命令已經可以找到,但是svn命令還是無法找到,但是使用man svn是可以檢視到的幫助資訊的。which指令會在環境變數$PATH設定的目錄裡查詢符合條件的檔案。
使用which命令檢視svn所在的目錄:
[root@db_dev_bak disk2]# which svn
/usr/local/bin/svn
於是將svn所在的路徑加在了svn前面,即對svn命令作如下修改:
修改原命令
svn co --username=xxxxx --password=xxxx http://svn.xxxx.net/xxxx/socdocs/trunk/devdba/db_release/

/usr/local/bin/svn co --username=xxxxx --password=xxxx http://svn.xxxx.net/xxxx/socdocs/trunk/devdba/db_release/
再看此時crontab任務生成的的dbmisProject.log,之前的svn: command not found錯誤已經消失,取而代之的是一個新的錯誤:
svn: Can't convert string from 'UTF-8' to native encoding:
svn: db_release/20090701?\232?\161?\165
cat: /home/dbmisTool/tmp/report_20091203.txt: No such file or directory
Null message body; hope that's ok

cron job在執行的時候只會定義少數環境變數而不是繼承使用者shell環境中的環境變數,所以在svn碰到含有cron job環境中
設定的字符集不能處理的字元的檔名時會導致檢出失敗。
解決方法就是在指令碼中加入:
export LC_CTYPE=zh_CN.GB18030
之前在網上看到有的是載入en_US.UTF-8字符集,但是我試了一下,在系統上顯示是亂碼,這個還是要因系統而異。
經過以上對指令碼的修改,終於大功告成,定時任務可以正常執行了。

PS:在完成對這個定時任務的修正以後得到了一個更為簡單的方法,即只要在指令碼中加入以下即可:

source /etc/profile
source /etc/sysconfig/i18n

 


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2120863/,如需轉載,請註明出處,否則將追究法律責任。

相關文章