本文接上一篇,上一篇配置構建完maven項目並發送到遠程服務器啟動微服務后,如果再次發布,雖然沒報錯,但是看進程id還是原來的進程。說明原有的項目不會被停止,新發布的沒有生效。
所以需要jenkins中配置shell語句先殺死進程。
網上搜jenkins主動殺死進程並重啟項目的方法,所有結果都是關於構建后殺死了進程什么的垃圾答案,只有一個正確答案是這個:https://blog.csdn.net/panyueke/article/details/107175087
BUILD_ID=dontKillMe cd /home/XXX git pull PIDS=`ps -ef|grep loko.py |grep python3 | awk '{print $2}'` for pid in $PIDS;do kill -9 $pid;done nohup python3 loko.py &
該語法含義是:查詢含有loky.py且含有python3的進程,將結果保存在PIDS中,然后遍歷PIDS,將每一項殺死。
其中awk命令的含義是:https://www.runoob.com/linux/linux-comm-awk.html
這個方法本身沒有錯,但怎奈我對於這些語法不熟悉,導致執行后發現有錯誤信息。
其實代碼本身沒錯,是該方法輸出了額外的查詢結果,導致殺死進程時提示某個進程不存在。
立馬我就想到是查詢結果里帶了搜索進程的pid(如下--color=auto行):
於是開始找解決方案,
思路一:如何不輸出搜索進程的行。
思路二:直接查找linux殺死多個進程的方法。
其實這兩種方式都沒有找到理想的答案,最后想起之前保存的一條jenkins殺死進程的語句(其實該語法是思路二),於是找出來重新認真學習。
ps -ef|grep test.jar|grep -v grep|cut -c 9-15|xargs kill -9
該語句的含義是:查找所有包含test.jar的進程(且不含grep),從每行結果中截取10-15號字符,然后將結果對應的進程殺死。
分析其中的每一步命令:
ps:https://www.runoob.com/linux/linux-comm-ps.html
grep -v grep:https://blog.csdn.net/dieyong/article/details/93008252
cut:這個沒有查找資料,自己從輸出結果分析是取行號10-15字符。
xargs:https://www.runoob.com/linux/linux-comm-xargs.html
該方法之前測試失敗,所以后來沒有使用,其實該語句並沒有錯誤,只是在進程不存在時會提示幫助信息,導致停止后續的操作。
此時上面提到的思路一也明了了,就是用grep -v grep 隱藏額外的搜索進程。
但這時忽然靈光一閃,看起來cut -c 9-15這個結果有瑕疵啊,先不說有沒有超過6位的進程id,就5位的進程id前后空格也不夠完美,如果跟上面提到的akw '{print $2}'結合不就完美了嗎。
經測試執行結果跟上面cut的一致,但是進程不存在時輸出的異常(幫助)信息也一致。。。
查資料發現原來是批量殺死進程當進程不存在時會直接提示幫助語法信息。
而解決思路就是判斷進程是否為空,具體為是否空字符。所以需要用到if語句。
if語法為:
if 你的條件判斷; then fi
但是按照網上說的判斷條件左右加中括號[]后報錯:unary operator expected,又查找答案說要加雙層中括號[[ ]],該方法並沒有解決我的問題:https://blog.csdn.net/whatday/article/details/103897163
查看錯誤輸出,用比較字符是否相等的判斷語句不行,即使給變量加單引號也不行,最后直接換成判斷字符長度(-n 變量)解決。
關於if [-n] 的用法:https://www.cnblogs.com/ariclee/p/6137456.html
最終的解決方案:
方案一:
BUILD_ID=dontKillMe PIDS=`ps -ef | grep test.jar | grep -v grep | awk '{print $2}'` if [ -n "$PIDS" ]; then ps -ef | grep test.jar | grep -v grep | awk '{print $2}' | xargs kill -9 fi
方案二:
BUILD_ID=dontKillMe PIDS=`ps -ef | grep test.jar | grep -v grep | awk '{print $2}'` for pid in $PIDS;do kill -9 $pid;done