Jenkins執行腳本后,會關閉啟動程序


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%


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM