crontab失敗的解決過程
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kodbox讀取alist檔案失敗,問題解決過程
- Android加殼過程中mprotect呼叫失敗的原因及解決方案Android
- sql server資料庫連線失敗/無法附加解決過程SQLServer資料庫
- npm install過程失敗的幾種處理方法NPM
- Token驗證失敗的解決方法
- Linux Yum 安裝失敗處理過程整理Linux
- MySql安裝過程中初始化失敗MySql
- puppeteer 安裝失敗的解決辦法
- 關於npm install失敗的解決方法NPM
- pyhanlp下載失敗解決方法HanLP
- git clone失敗問題解決Git
- npm安裝失敗解決方案NPM
- 解決Autowired注入失敗為nullNull
- VScode 更新失敗解決辦法VSCode
- dbsnmp啟動失敗解決方法
- npm install 失敗解決辦法NPM
- 解決linux rz傳輸失敗Linux
- anaconda安裝失敗解決方法
- python tarfile解壓失敗怎麼解決Python
- 企業資料中臺實施過程中失敗的因素
- myeclipse2017破解過程以及遇到的破解失敗的問題Eclipse
- 遠端連線 Mysql 失敗的解決方法MySql
- 對USB驅動下載失敗的解決
- TortoiseSVN 執行清理( cleanUp )失敗的解決方案
- go get下載包失敗的解決方案Go
- python 安裝pandas失敗的解決辦法Python
- 【Python】pydot安裝失敗解決方法Python
- mongodb啟動失敗問題解決MongoDB
- NPM run dev 失敗解決辦法NPMdev
- npm install安裝失敗解決方法NPM
- mysql(mariadb)啟動失敗解決方法MySql
- 解決Wireshark安裝Npcap元件失敗PCA元件
- anaconda prompt開啟失敗解決方法
- python用install失敗怎麼解決Python
- redis lRem 刪除失敗?(已解決)RedisREM
- hbase啟動失敗問題解決
- vagrant啟動身份驗證失敗的解決方式
- 解決IDEA建立maven工程失敗的一種方法IdeaMaven
- zblog應用中心連線失敗的解決方案