【jenkins】中通過execute shell啓動的進程會被殺死的問題

【jenkins】中通過execute shell啓動的進程會被殺死的問題

在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
  1. 在部落內部時不時的會有同學問一爲什麼在execute shell中不能啓動tomcat、爲什麼在windows batch中不能啓動tomcat等問題,其實大部分情況下不是不能啓動,而是啓動後隨着job結束進程被殺死,造成不能啓動的假象,這一點從tomcat的日誌中可以看來,雖然也給出瞭解決方法,但沒有回答本質問題,利用週末和晚上的時間對這個問題進行探究,並總結下來供大家參考。
  2. Jenkins爲了有效的殺死job運行時創建的子進程,提供了一些原生代碼找到並殺死它們,這樣做非常合理,當一個job結束時勢必要殺死運行期間啓動的進程,否則系統裏會留下很多殭屍進程。儘管Jenkins聲稱這個功能在各種環境下做了測試,但爲了應付在特殊環境下出現的特殊情況,Jenkins提供了禁用此特性的方法。
  3. Jenkins的做法雖然非常合理,但也造成了一些問題,如我們希望在execute shell或windows batch中啓動的web應用在job結束後繼續運行,可以通過兩種方法達到這個目錄,下面分介紹。

方法一:通過Jenkins提供的啓動參數禁用殺死子進程的特性

Jenkins提供了hudson.util.ProcessTree.disabl
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=BUILDIDecho OLD_BUILD_ID
BUILD_ID=DONTKILLME //”DONTKILLME”只是爲了可讀性才寫的,可以用任何你想用的內容代替
startup.sh //根據實際情況修改啓動命令的路徑
BUILD_ID=OLDBUILDIDecho 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%

參考資料
https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章