轉自:https://www.cnblogs.com/dengmeinan/p/8000685.html
背景:
就是爲了寫一個重啓tomcat的腳本,讓jenkins編譯、打包、發佈時調用。在本地寫好重啓tomcat的腳本後,本地執行腳本沒有問題,但在遠程服務器上SSH免密登陸執行後。
發現能夠把TOMCAT殺死,但tomcat卻起不來。這個問題困擾了我一天。終於解決了,決定寫篇博文與你們分享。html
把我遇到的怪異現象分享給你們:
1 腳本執行了嗎?sh -x 查看腳本執行過程,確實執行了啊,也沒有報錯。但到目標服務器去看卻沒有java進程,也沒有相應的端口。邪門了,究竟是什麼緣由呢?
2 看日誌。在遠程執行腳本的時候就把日誌打開了,tail -f 發現沒有一丁點的日誌輸出。
3 有人說是環境變量的問題。我的感受不是啊。我在本地能夠執行腳本說明不是環境變量的問題。java
緣由:
有人說:這個腳本遠程運行的話,遠程會話結束之後會把這個子進程幹掉。
有人說:就如同,你在本地xshell執行腳本 腳本還在跑的階段你關閉xshell ,你怎麼讓腳本不中止而繼續運行呢?
有人說:你這個進程過去 ansible執行完了就沒了。個人ansible命令是這樣的shell
ansible abcd -u root -m shell -a "sh -x /data/scripts/start_tomcat.sh"
我本身作了一個測試,我在腳本里啓動tomcat後sleep了60秒,我看到tomcat啓來了,有日誌了,也看到端口了,60秒後端口就自動消失了,同時這個不會寫到日誌裏。
說明,能夠證明一個事情,「這個腳本遠程運行的話,遠程會話結束之後會把這個子進程幹掉。」apache
解決辦法:
在腳本的啓動命令前加上nohup ,即以下後端
nohup /data/server/apache-tomcat-8.0.47-8080/bin/startup.sh &
還有一個解決辦法就是
shell腳本里邊加上這一行就好了:BUILD_ID=DONTKILLME (在使用jenkins的時候)
在jenkins中配置自動更新部署項目時,若是採起用execute shell啓動/關閉tomcat,會發現能夠進行關閉tomcat,
可是沒法啓動tomcat,雖然構建會顯示執行成功,可是查看進程,tomcat是沒有啓動的。這是由於Jenkins默認會在
Build結束後Kill掉全部的衍生進程。須要進行如下配置,才能避免此類狀況發生:重設環境變量build_idtomcat
在execute shell輸入框中加入 BUILD_ID=DONTKILLME, 便可防止jenkins殺死啓動的tomcat進程
參考連接:
https://www.cnblogs.com/superjt/p/4079013.html #SSH遠程啓動tomcat後,退出SSH,tomcat也退出
http://blog.csdn.net/zhengxu189891/article/details/18710155 #jenkins中經過execute shell啓動的進程會被殺死的問題服務器