Linux Shell腳本語句執(zhí)行失敗,后續(xù)語句繼續(xù)執(zhí)行的問題及解決
Linux Shell腳本語句執(zhí)行失敗,后續(xù)語句繼續(xù)執(zhí)行
問題
寫了一個自動部署java后端的腳本,大致如下:
A=password read -p "請輸入密碼:" PASSWD if [ "$PASSWD" == "$A" ] then echo "密碼正確!" cd /auto_deployment/javaBackendPath/backendService git clean -f -d git reset --hard HEAD git pull mvn clean install -Dmaven.test.skip=true -Pprod if [ $? -eq 0 ] then echo "Succeed in building new commits." # 執(zhí)行部署代碼 fi else echo "密碼錯誤,請重啟輸入!" fi
由于shell腳本和python這些語言執(zhí)行時,不太一樣。遇到錯誤和未成功執(zhí)行的語句后并不會報錯退出,而是會報錯,然后繼續(xù)執(zhí)行后續(xù)的語句。
上段代碼因為需要進入的“/auto_deployment/javaBackendPath/backendService”路徑?jīng)]有找到,就沒有執(zhí)行,而是再當(dāng)前的目錄下執(zhí)行了之后git相關(guān)的語句,好巧不巧當(dāng)前目錄再半年前是設(shè)置過git但一直沒有更新維護過的,整個文件夾就恢復(fù)到了半年前的樣子,后面寫的文件全部消失。最后是從當(dāng)天的備份中還原回來的,花了4個小時。
解決方法
set -o errexit #增加這句話,出錯之后就會退出啦 set -e #這句話和上一句是一樣的,寫一個就好了 A=password read -p "請輸入密碼:" PASSWD if [ "$PASSWD" == "$A" ] then echo "密碼正確!" cd /auto_deployment/javaBackendPath/backendService git clean -f -d git reset --hard HEAD git pull mvn clean install -Dmaven.test.skip=true -Pprod if [ $? -eq 0 ] then echo "Succeed in building new commits." # 執(zhí)行部署代碼 fi else echo "密碼錯誤,請重啟輸入!" fi
linux shell腳本執(zhí)行完第一行命令完成后,在執(zhí)行第二行命令問題處理
這段時間在給tomcat做日志分割,再使用定時任務(wù)去執(zhí)行shell腳本時,發(fā)現(xiàn)切割后的日志文件老是被置空,手動執(zhí)行shell腳本卻沒有任何問題。
下面為shell腳本內(nèi)容
# 復(fù)制日志文件內(nèi)容到新的文件中 cp /home/work/tomcat/logs/catalina.out /home/work/tomcat/logs/catalina_`date -d '-1 days' +%Y%m%d`.log # 清空tomcat默認(rèn)日志輸出文件 echo "" > /home/work/tomcat/logs/catalina.out
在多次測試后,發(fā)現(xiàn)是復(fù)制日志還沒完成時,就已經(jīng)將清空日志的命令給執(zhí)行了。導(dǎo)致直接將空日志給復(fù)制到每天的日志文件里去了。
因此這個問題就變成了如何在shell腳本執(zhí)行完第一條命令完成后,在執(zhí)行第二條。
這個問題也挺常見的,經(jīng)常出現(xiàn)于上一個命令對一個文件處理沒有完成就進行了下一個命令對該文件進行操作的場景。
網(wǎng)上有很多方法
如:
① 在兩條命令之間添加 &&
實測在這個場景中無效
②使用if else 或者 while,利用執(zhí)行的結(jié)果去判斷命令是否執(zhí)行完成,然后進行下一步操作
覺得太過麻煩,沒有進行測試
后續(xù)處理:
①分開使用兩個shell腳本,然后分兩次定時任務(wù)調(diào)用。
即將上一個shell腳本的兩條命令分割成兩個shell腳本,然后在定時任務(wù)里分別對兩個shell腳本設(shè)定時任務(wù)執(zhí)行即可。
②在shell腳本里使用延遲等待sleep(單條腳本服務(wù)過多可能依舊會發(fā)生日志置空問題)
# 復(fù)制日志文件內(nèi)容到新的文件中 cp /home/work/tomcat/logs/catalina.out /home/work/tomcat/logs/catalina_`date -d '-1 days' +%Y%m%d`.log # 延遲等待3秒 sleep 3 # 清空tomcat默認(rèn)日志輸出文件 echo "" > /home/work/tomcat/logs/catalina.out
執(zhí)行完上個命令后,延時等待相應(yīng)時間再執(zhí)行下一個命令
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
jenkins 實現(xiàn)shell腳本化定時執(zhí)行任務(wù)的方法
這篇文章主要介紹了jenkins 實現(xiàn)shell腳本化定時執(zhí)行任務(wù),解決訪問是jenkins構(gòu)建好之后將jar遠(yuǎn)程推送到生產(chǎn)服務(wù)器,提前退出后臺執(zhí)行服務(wù)器遠(yuǎn)程腳本,腳本通過ngnx提前切走nginx代理auction sleep 1800s,半小時后執(zhí)行更新重啟,具體操作過程跟隨小編一起看看吧2022-01-01exit(-1)或者return(-1)shell得到的退出碼為什么是255
exit(-1)或者return(-1)shell得到的退出碼為是255,大家知道為什么嗎?帶著這個疑問來腳本之家學(xué)習(xí)下吧,本篇文章告訴大家答案2015-10-10用shell腳本監(jiān)控進程是否存在 不存在則啟動的實例
這篇文章主要介紹了用shell腳本監(jiān)控進程是否存在 不存在則啟動的實例,需要的朋友可以參考下2016-03-03完美解決Linux搭建sftp出現(xiàn)Write failed:Broken pipe的問題
下面小編就為大家?guī)硪黄昝澜鉀QLinux搭建sftp出現(xiàn)Write failed:Broken pipe的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06