1. 程式人生 > >linux crontab執行shell指令碼中包含相對路徑的問題

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就被殺掉,重啟時卻因為上面的問題沒成功。於是修改指令碼,狀態是後兩種時才重啟。這個問題也解決了。