實例一 test.sh文件java
echo `date`>test.logshell
配置crontab框架
設置 */1 * * * * sh /data/test.shui
在/data/目錄下,未找到test.log文件,重啓了crontab服務,service cronb restart,發現仍是不行。spa
在網上找資料,懷疑是相對路徑的問題,而後,在home目錄下,cd ~,發現了test.log。調試
轉摘資料:rest
一 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都用絕對路徑,再調試,終於成功,至此問題解決。但始終感受在程序中用絕對路徑很不方便維護。crontab
三 附加問題及解決 此腳本的做用就是判斷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就被殺掉,重啓時卻由於上面的問題沒成功。因而修改腳本,狀態是後兩種時才重啓。這個問題也解決了。