Jenkins構建完成以後運行腳本能夠殺掉TomCat可是起不來的解決方法
寫了一個重啓tomcat的腳本,讓jenkins編譯、打包、發佈時調用。在本地寫好重啓tomcat的腳本後,本地執行腳本沒有問題,但在遠程服務器上SSH免密登陸執行後。發現能夠把TOMCAT殺死,但tomcat卻起不來。試了不少次發現都是隻可以殺掉Tomcat可是啓動不起來。html
百度了一下,有人說腳本遠程運行的話,遠程會話結束之後會把這個子進程幹掉。也就是說當Jenkins遠程執行完這個腳本以後,這個腳本所衍生的全部子進程都會被殺掉。shell
重啓Tomcat的腳本:後端
#重啓tomcat服務器 pid=`lsof -i:8080|awk 'NR==2{print $2}'` kill -9 $pid sh /home/tomcat/bin/startup.sh &
爲了證明這一說法,修改了腳本:tomcat
#重啓tomcat服務器 pid=`lsof -i:8080|awk 'NR==2{print $2}'` kill -9 $pid cd /home/tomcat/bin/ sh ./startup.sh sleep 60
Jenkins再次構建並執行該腳本,發現TomCat啓來了,有日誌了,也看到端口了,60秒後端口就自動消失了,同時這個不會寫到日誌裏。說明上面關於遠程執行的腳本會話結束之後會把這個子進程幹掉的說法是成立的。服務器
解決辦法
在腳本的啓動命令前加上nohup ,即以下ui
nohup sh /home/tomcat/bin/startup.sh &
或者:url
在使用jenkins的時候shell腳本里邊加上這一行就好了:BUILD_ID=DONTKILLME
spa
在jenkins中配置自動更新部署項目時,若是採起用execute shell啓動/關閉tomcat,會發現能夠進行關閉tomcat,可是沒法啓動tomcat,雖然構建會顯示執行成功,可是查看進程,tomcat是沒有啓動的。這是由於Jenkins默認會在Build結束後Kill掉全部的衍生進程。須要進行如下配置,才能避免此類狀況發生:重設環境變量build_id,在execute shell輸入框中加入BUILD_ID=DONTKILLME,便可防止jenkins殺死啓動的tomcat進程。.net
BUILD_ID=DONTKILLME #重啓tomcat服務器 pid=`lsof -i:8080|awk 'NR==2{print $2}'` kill -9 $pid sh /home/tomcat/bin/startup.sh &
參考連接: SSH遠程啓動tomcat後,退出SSH,tomcat也退出 jenkins中經過execute shell啓動的進程會被殺死的問題日誌