jenkins 腳本啟動服務無法后台運行。
start.sh這個腳本為zt-erp-schesule的啟動腳本
腳本為
#!/bin/bash
echo "start server..."
_servername=zt-erp-schedule.jar
cd /home/project/erp/zt-erp-schedule/
nohup java -jar $_servername --spring.profiles.active=test &
echo "success!"
構建完成,發現服務進程不存在。
jenkins構建完成后,會殺死衍生進程。
在腳本中加入BUILD_ID=dontKillMe就好了
#!/bin/bash
BUILD_ID=dontKillMe
echo "start server..."
_servername=zt-erp-schedule.jar
cd /home/project/erp/zt-erp-schedule/
nohup java -jar $_servername --spring.profiles.active=test &
echo "success!"
百度到原因,感謝這個哥們
解釋原因引用https://blog.csdn.net/u011138533/article/details/53941123
在jenkins中配置自動更新部署項目時,如果采取用execute shell啟動/關閉tomcat,會發現可以進行關閉tomcat,但是無法啟動tomcat,雖然構建會顯示執行成功,但是查看進程,tomcat是沒有啟動的。這是因為Jenkins默認會在Build結束后Kill掉所有的衍生進程。需要進行以下配置,才能避免此類情況發生:
1.重設環境變量build_id
在execute shell輸入框中加入BUILD_ID=DONTKILLME,即可防止jenkins殺死啟動的tomcat進程
2.在啟動jenkins 的時候禁止jenkins殺死衍生進程
修改/etc/sysconfig/jenkins配置,在JENKINS_JAVA_OPTIONS中加入-Dhudson.util.ProcessTree.disable=true。需要重啟jenkins生效
此方法配置一次后,所有的job都無需設置BUILD_ID,就能夠防止jenkins殺死啟動的tomcat進程
舉例:
BUILD_ID=DONTKILLME
ps -ef |grep tomcat8 |awk '{print $2}'|xargs kill -9
cd /opt/tomcat8/bin
sh ./shutdown.sh
sleep 40s
cd /opt/var/kms_conf/
sh ./tinykms.sh
cd /opt/tomcat8/bin
sh ./startup.sh
在部落內部時不時的會有同學問一為什么在execute shell中不能啟動tomcat、為什么在windows batch中不能啟動tomcat等問題,其實大部分情況下不是不能啟動,而是啟動后隨着job結束進程被殺死,造成不能啟動的假象,這一點從tomcat的日志中可以看來,雖然也給出了解決方法,但沒有回答本質問題,利用周末和晚上的時間對這個問題進行探究,並總結下來供大家參考。
Jenkins為了有效的殺死job運行時創建的子進程,提供了一些原生代碼找到並殺死它們,這樣做非常合理,當一個job結束時勢必要殺死運行期間啟動的進程,否則系統里會留下很多僵屍進程。盡管Jenkins聲稱這個功能在各種環境下做了測試,但為了應付在特殊環境下出現的特殊情況,Jenkins提供了禁用此特性的方法。
Jenkins的做法雖然非常合理,但也造成了一些問題,如我們希望在execute shell或windows batch中啟動的web應用在job結束后繼續運行,可以通過兩種方法達到這個目錄,下面分介紹。
方法一:通過Jenkins提供的啟動參數禁用殺死子進程的特性
Jenkins提供了hudson.util.ProcessTree.disable和hudson.util.ProcessTreeKiller.disable兩個屬性來控制些特性,值為true將禁用此特性。hudson.util.ProcessTree.disable從Jenkins 1.260開始使用,而使用1.315之前的Hudson時只能使用hudson.util.ProcessTreeKiller.disable,為了版本兼容,在Jenkins 1.260后這兩個屬性都可能使用,建議使用1.260之的Jenkins用戶使用hudson.util.ProcessTree.disable屬性。
這種方式需要在Jenkins啟動前進行設置,以下根據筆者的經驗列舉各種使用情況下如何設置,如有疏漏歡迎補充、指正。
- 使用java -jar啟動,-Dhudson.util.ProcessTree.disable=true -jar jenkins.war
- 使用Tomcat啟動,Linux系統修改catalina.sh,在環境變量的說明后,腳本開始前加上JAVA_OPTS="$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true";Windows系統修改catalina.bat,在環境變量的說明后,腳本開始前加上set JAVA_OPTS=%JAVA_OPTS% "-Dhudson.util.ProcessTree.disable=true";修改好Tomcat的配置文件后重新啟動Tomcat
在大部分情況下徹底禁用此特性可能不是我們期望的結果,這種方法不建議在工作中使用,建議的方法請參考“方法二”
方法二:修改Jenkins的環境變量BUILD_ID,這樣Jenkins將不認為你啟動的后台進程是由job創建的
在execute shell或windows batch輸入框的中執行期望job結束后繼續運行的命令前加上如下代碼(以啟動tomcat為例):
Linux:
OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=DONTKILLME //"DONTKILLME"只是為了可讀性才寫的,可以用任何你想用的內容代替
startup.sh //根據實際情況修改啟動命令的路徑
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
Windows
OLD_BUILD_ID=%BUILD_ID%
echo %OLD_BUILD_ID%
BUILD_ID=DONTKILLME
startup.bat //根據實際情況修改啟動命令的路徑
BUILD_ID=%OLD_BUILD_ID%
echo %BUILD_ID%