crontab定時執行shell腳本失敗的緣由

有一段時間不用crontab定時執行任務了,此次趁着項目實施的機會來進一步分析一下crontab定時任務設置時遇到的一些棘手的問題。java

crontab -l 查看目前已經設置的crontab信息shell

crontab -e 編輯定時任務bash

舉例說明spa

*/1 * * * *  jstack 進程號 >> jstack.logcode

前五個「*」號分別表明「分鐘(0-59) 小時(0-23) 天(1-31) 月(1-12) 星期(0-6, 0表示星期日)blog

上面例子中表示的每隔一分鐘就執行一次jstack並將運行結果輸出到jstack.log中。進程

有小夥伴可能會說,這樣執行可能會不成功哦,那麼問題來了,爲何會不成功?crontab

若是當前你用的是root用戶,並且環境變量中若是配置好了java環境變量,那麼執行上面的crontab是沒問題的,可是若是你用的其餘新建的用戶,雖然你可能也配置了java環境變量class

可是crontab不會讀取你其餘用戶環境變量中的內容,因此解決方案是把執行命令保存成一個shell腳本,在腳本中顯示執行當前用戶的環境變量,再運行命令輸出test

1 #!/bin/bash
2 . /etc/profile
3 . ~/.bash_profile
4 echo 獲取java進程號
5 pid=`ps -ef|grep java|awk '{print $2}'`
6 echo ${pid}
7 echo 開始記錄jstack信息,並輸出到根目錄的jstack.log
8 jstack ${pid} >> jstack.log

假設上面這段代碼保存到jstack.sh文件,這樣再設置crontab的時候直接

*/1 * * * *   /home/test/jstack.sh 

這樣就能夠啦,觀察jstack.log文件的增加狀況,這樣就避免了使用絕對路徑的問題。

相關文章
相關標籤/搜索