Jenkins構建完成之后運行腳本可以殺掉TomCat但是起不來的解決方法
寫了一個重啟tomcat的腳本,讓jenkins編譯、打包、發布時調用。在本地寫好重啟tomcat的腳本后,本地執行腳本沒有問題,但在遠程服務器上SSH免密登錄執行后。發現可以把TOMCAT殺死,但tomcat卻起不來。試了很多次發現都是只能夠殺掉Tomcat但是啟動不起來。
百度了一下,有人說腳本遠程運行的話,遠程會話結束以后會把這個子進程干掉。也就是說當Jenkins遠程執行完這個腳本之后,這個腳本所衍生的所有子進程都會被殺掉。
重啟Tomcat的腳本:
#重啟tomcat服務器
pid=`lsof -i:8080|awk 'NR==2{print $2}'`
kill -9 $pid
sh /home/tomcat/bin/startup.sh &
為了證實這一說法,修改了腳本:
#重啟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 ,即如下
nohup sh /home/tomcat/bin/startup.sh &
或者:
在使用jenkins的時候shell腳本里邊加上這一行就行了:BUILD_ID=DONTKILLME
在jenkins中配置自動更新部署項目時,如果采取用execute shell啟動/關閉tomcat,會發現可以進行關閉tomcat,但是無法啟動tomcat,雖然構建會顯示執行成功,但是查看進程,tomcat是沒有啟動的。這是因為Jenkins默認會在Build結束后Kill掉所有的衍生進程。需要進行以下配置,才能避免此類情況發生:重設環境變量build_id,在execute shell輸入框中加入BUILD_ID=DONTKILLME,即可防止jenkins殺死啟動的tomcat進程。
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啟動的進程會被殺死的問題