1. 程式人生 > >Jenkins——應用篇——如何解決execute shell中啟動的程序被在Job退出時被殺死問題

Jenkins——應用篇——如何解決execute shell中啟動的程序被在Job退出時被殺死問題

在部落內部時不時的會有同學問一為什麼在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%

參考資料

https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller