SSH遠程執行腳本tomcat未啟動
背景:
就是為了寫一個重啟tomcat的腳本,讓jenkins編譯、打包、發布時調用。在本地寫好重啟tomcat的腳本后,本地執行腳本沒有問題,但在遠程服務器上SSH免密登錄執行后。
發現可以把TOMCAT殺死,但tomcat卻起不來。這個問題困擾了我一天。終於解決了,決定寫篇博文與大家分享。
把我遇到的怪異現象分享給大家:
1 腳本執行了嗎?sh -x 查看腳本執行過程,確實執行了啊,也沒有報錯。但到目標服務器去看卻沒有java進程,也沒有相應的端口。邪門了,到底是什么原因呢?
2 看日志。在遠程執行腳本的時候就把日志打開了,tail -f 發現沒有一丁點的日志輸出。
3 有人說是環境變量的問題。個人感覺不是啊。我在本地可以執行腳本說明不是環境變量的問題。
原因:
有人說:這個腳本遠程運行的話,遠程會話結束以后會把這個子進程干掉。
有人說:就如同,你在本地xshell執行腳本 腳本還在跑的階段你關閉xshell ,你怎么讓腳本不停止而繼續運行呢?
有人說:你這個進程過去 ansible執行完了就沒了。我的ansible命令是這樣的 ansible abcd -u root -m shell -a "sh -x /data/scripts/start_tomcat.sh"
我自己做了一個測試,我在腳本里啟動tomcat后sleep了60秒,我看到tomcat啟來了,有日志了,也看到端口了,60秒后端口就自動消失了,同時這個不會寫到日志里。
說明,可以證實一個事情,“這個腳本遠程運行的話,遠程會話結束以后會把這個子進程干掉。”
解決辦法:
在腳本的啟動命令前加上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_id
在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啟動的進程會被殺死的問題