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%

猜你喜欢

转载自www.cnblogs.com/liu-sy/p/13389851.html