linux crontab執行shell腳本中包含相對路徑的問題


實例一 test.sh文件

echo `date`>test.log

配置crontab

設置 */1 * * * * sh /data/test.sh


在/data/目錄下,未找到test.log文件,重啟了crontab服務,service cronb restart,發現還是不行。


在網上找資料,懷疑是相對路徑的問題,然后,在home目錄下,cd ~,發現了test.log。


轉摘資料:

crontab執行java程序的問題:

一 crontab使用注意:
crontab -l查看該用戶的crontab配置,crontab -e編輯該用戶的crontab配置配置一般在末尾加上 2>&1表示錯誤輸出(2)和標准輸出(1)一樣輸出到同一個由前面>>指定的地方
如 15 14 * * * /sys_back/monitor.sh >>/sys_back/log/monitor.log 2>&1
表示每天14:15執行monitor.sh腳本,錯誤和標准輸出都寫入monitor.log文件
涉及到文件名時最好寫絕對路徑!

二 問題及解決
shell腳本有echo語句,有java -jar執行java程序。直接執行腳本時,一切順利,但是放到crontab中執行時,echo語句正常,java程序卻沒有執行。

1 網上查找,覺得應該是環境變量的問題。說是要將java環境變量加入到shell腳本中,按照
這個方法做,發現問題依然存在。
百思不得其解。
2 經轉換角度,看java程序是否有問題。在java語句中直接加入打印語句,發現其在crontab日志中
居然可以顯示。終於確定是java程序的問題。java程序功能很簡單,就是一個語句java -Dosgi.console -Dosgi.configuration.area=./configuration -jar equinox.jar -console用來啟動osgi框架。
於是在shell腳本中不調用java程序,直接改為程序中的這一句,問題解決。
但是又引發新的問題:直接java -jar會源源不斷的輸出osgi>到日志文件,導致日志文件越來越大。
不可行。再想辦法解決。
3 感覺還是相對路徑的問題。嘗試在crontab調用的腳本中用相對路徑向一個文件輸出一句話,發現失敗。(單獨執行腳本沒問題)既然如此,是不是java程序中也不能用相對路徑呢。遂將./configuration及equinox.jar都用絕對路徑,再調試,終於成功,至此問題解決。但始終感覺在程序中用絕對路徑很不方便維護。

三 附加問題及解決
此腳本的作用就是判斷osgi程序是否在運行,如果不運行則啟動。
實現思路是ps -elf得到進程id及狀態,如果id不存在,則啟動,如果id存在但狀態不是運行中(solaris為O,AIX為A),則殺掉原進程重新啟動。
發現程序在運行幾天后會自動停掉,以為是java程序有問題,然而卻始終找不到問題在哪里。在解決上面問題時,卻意外的發現可能不是java程序的問題。man ps時發現,solaris中,進程狀態除了O,還有S(sleeping) R(Runnable) Z(Zombie僵屍進程)T(stopped),只有后兩種狀態下進程才是有問題的,所以很可能是crontab執行腳本時,程序狀態非O就被殺掉,重啟時卻因為上面的問題沒成功。於是修改腳本,狀態是后兩種時才重啟。這個問題也解決了。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM