Linux系統(tǒng)crontab定時運(yùn)行shell腳本失敗的問題及解決
1.最近開始學(xué)習(xí)Linux系統(tǒng)使用
經(jīng)過一段時間學(xué)習(xí)終于學(xué)到了shell腳本,因?yàn)閷W(xué)的東西比較零散,突發(fā)奇想我學(xué)過了crontab定時任務(wù),今天也學(xué)了shell腳本的編寫,為何不組合一下,既能提升學(xué)習(xí)深度,又能鍛煉自學(xué)能力,何樂而不為呢?但是沒想到,我已步入了Linux的坑。
2.腳本倒是很簡單
因?yàn)閯倢W(xué)習(xí),寫的命令都很簡單,請各位大神不要笑我,我寫這篇博客目的一是為了記錄踩過的坑,加深映像,二是給和我一樣的新手提個醒,避免長時間陷入到坑里。
以下是我shell腳本的代碼
#!/bin/bash date >> /myshell/date.log
這個腳本的作用是每次運(yùn)行該腳本,將當(dāng)前時間累加寫入在/myshell/文件夾下的date.log文件中
首先我們要給這個腳本添加執(zhí)行權(quán)限用添加權(quán)限的命令就行了
chmod 777 time.sh
目前我遇到的問題是要執(zhí)行該腳本,目前只能在腳本所在目錄用./time.sh執(zhí)行。所以為了解決這個問題,我經(jīng)過思考和某度,找到了兩種方式讓我們的腳本在其他目錄直接使用time.sh命令都可以運(yùn)行腳本。
第一種
我們使用$PATH查看系統(tǒng)現(xiàn)有的環(huán)境變量目錄,也就是如果將我們的腳本放到這些任一個目錄中,就可以在其他目錄使用time.sh來運(yùn)行我們的腳本。
但是由于這些目錄存放的文件都是比較重要的。
或是系統(tǒng)文件,所以這種方式我覺得不太推薦,當(dāng)然,高手的話隨意就行,對于我這種初學(xué)者的話就盡量避開這種危險的東西。
第二種
我思考既然通過$PATH看到的這些目錄,把腳本放進(jìn)去就可以在其他地方運(yùn)行,那我們應(yīng)該也可以把我們寫的腳本所在的目錄添加到這個環(huán)境變量中,這樣就可以達(dá)到我們的目的,于是根據(jù)這個思路,我又進(jìn)行了某度,找到了解決方法。
可以用
vim /etc/profile
打開這個文件,在文件中添加如下代碼:
export PATH=/myshell:$PATH
添加后保存退出,這段代碼的原理就是在系統(tǒng)調(diào)用這個文件的時候,將環(huán)境變量PATH和我們需要自定義的目錄拼接起來重新生成的PATH環(huán)境變量替換以前的,達(dá)到我們需要設(shè)置自定義目錄的目的,要讓我們編輯的內(nèi)容生效,相當(dāng)于讓系統(tǒng)重新加載我們修改過的這個文件
用如下命令就行:
source /etc/profile
這樣,再用$PATH命令查看,就可以看到我們自定義的文件夾也到PATH這個環(huán)境變量的值中了。
這時候執(zhí)行一下命令time.sh發(fā)現(xiàn)/myshell目錄下就多了一個date.log文件了。
再其他目錄執(zhí)行time.sh命令,然后查看date.log命令,相應(yīng)時間也在文件中累加了。
原以為再用crontab把定時執(zhí)行任務(wù)設(shè)置好就大功告成,可是更大的坑才剛剛開始。
添加定時執(zhí)行任務(wù)
* 11 * * * time.sh
這個任務(wù)意思就是在十一點(diǎn)到十二點(diǎn)這個范圍內(nèi),每隔一分鐘執(zhí)行一下time.sh這個腳本。具體的語法不知道的初學(xué)者可以某度一下,資料很多的。
重啟一下crontab服務(wù)
service crond restart
然后使用命令實(shí)時查看date.log文件累加內(nèi)容的情況
tail -f date.log
等了很長時間,內(nèi)容都沒變,是定時任務(wù)沒執(zhí)行成功?還是腳本出錯了?
然后趕緊瘋狂某度一下crontab運(yùn)行的日志記錄文件存放位置,實(shí)時更新查看一下:
tail -f /var/log/cron
等了幾分鐘,發(fā)現(xiàn)每隔一分鐘定時任務(wù)有執(zhí)行記錄
但是查看date.log文件,發(fā)現(xiàn)內(nèi)容并沒有累加。
看來可能是crontab執(zhí)行時候出錯了。
于是修改定時任務(wù)語句,將定時任務(wù)執(zhí)行的錯誤信息也寫入到date.log文件中,看看報(bào)錯內(nèi)容是什么。
將定時任務(wù)修改為以下代碼
* 11 * * * time.sh >> /myshel/date.log 2>&1
等幾分鐘,查看date.log的內(nèi)容,顯示如下
沒有找到命令,可是我剛才不管是在文件目錄還是其他目錄都執(zhí)行成功腳本了啊,為什么crontab執(zhí)行還是報(bào)錯找不到腳本呢?
會不會是環(huán)境變量的問題呢,帶著猜想我再次進(jìn)行某度,過程很艱辛,最后算是證實(shí)我的猜想是對的,就是系統(tǒng)環(huán)境變量和crontab使用的環(huán)境變量不一樣導(dǎo)致的,其中過程由于篇幅有限,我就不細(xì)述了,直接說解決辦法
最后我找到兩解決辦法
第一:定時任務(wù)語句中以root用戶來執(zhí)行,修改定時任務(wù)語句如下:
* 11 * * * su - root -c time.sh
而后發(fā)現(xiàn)腳本成功執(zhí)行了。
第二:定時任務(wù)腳本前面加上腳本所在目錄絕對路徑,定時任務(wù)語句修改為:
* 11 * * * /myshell/time.sh
再次觀察,腳本也成功執(zhí)行了。
當(dāng)然,我還查到了其他很多方法,時間有限,沒有一一測試,大家有興趣的話可以多試試其他方法。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
crontab定時任務(wù)不執(zhí)行的一些原因總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于crontab定時任務(wù)不執(zhí)行的一些原因,對每種可能發(fā)生的原因都給出了解決方法,對遇到這個問題的朋友們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01ubuntu系統(tǒng)下apache配置虛擬主機(jī)及反向代理詳解
這篇文章主要介紹了ubuntu系統(tǒng)下apache配置虛擬主機(jī)及反向代理的相關(guān)資料,文中通過實(shí)例給大家演示的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下來一起學(xué)習(xí)學(xué)習(xí)吧。2017-06-06解決-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 權(quán)限不夠問題
這篇文章主要介紹了解決-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 權(quán)限不夠的問題,需要的朋友可以參考下2019-09-09Apache的壓力測試以及web性能優(yōu)化的常用知識總結(jié)
這篇文章主要介紹了Apache的壓力測試以及web性能優(yōu)化的常用知識總結(jié),筆記由《構(gòu)建高性能web站點(diǎn)》這本高人氣書籍整理而來,需要的朋友可以參考下2015-12-12實(shí)戰(zhàn) LAMP 服務(wù)器配置 完整篇
LAMP 服務(wù)器配置 按部就班篇,大家可以學(xué)習(xí)試試。2009-06-06