Jenkins构建后Execute shell,执行成功但进程被杀或服务停止

发现问题

最近开始测试Dubbo服务,使用到了Jenkins的自动构建,并在构建完成后自动替换同版本文件,杀死对应的正在运行的进程。
但在本地测试无误进行Jenkins构建时,构建信息提示构建成功无误,Jenkins能够替换文件并解压,同时提示启动成功。

1
2
3
4
5
6
7
8
9
10
11
#构建日志
com-auth-provider/lib/netty-3.7.0.Final.jar
com-auth-provider/lib/logback-classic-1.0.13.jar
com-auth-provider/lib/logback-core-1.0.13.jar
com-auth-provider/lib/com-auth-provider-0.0.1.jar
Unzip File Success !
Starting the auth-provider ....OK!
PID: 29738
STDOUT: logs/stdout.log
Start Server.sh
Finished: SUCCESS

但在Dubbo注册中心没有发现对应服务提供者,同时没有找到对应的进程。

1
2
jenkins@iZubZ:/usr/local/jenkins/service# ps -ef|grep java|grep provider
jenkins@iZubZ:/usr/local/jenkins/service#

但是通过手动启动服务则没有问题,服务在注册中心注册成功,进程正常。

1
2
3
4
5
6
7
8
9
jenkins@iZubZ:/usr/local/jenkins/service/com-auth-provider# ./bin/start.sh
Starting the auth-provider ....OK!
PID: 31461
STDOUT: logs/stdout.log
jenkins@iZubZ:/usr/local/jenkins/service/com-auth-provider# ps -ef|grep java|grep provider
jenkins 31461 1 46 12:05 pts/2 00:00:05 java -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xmx2g -Xms2g
-Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompac
tAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOcc
upancyFraction=70 -classpath /usr/local/jenkins/service/......

请教度娘

在网上看见有个大神的博客如何解决execute shell中启动的进程被在Job退出时被杀死问题,使用同样的方式启动Tomcat也是进程被干掉,提到了Jenkins为了避免给系统留下僵尸进程,会在一个任务构建完后杀死运行期间启动的所有进程。
通过Jenkins官方文档,Jenkins说明了该事实,同时为了应付在特殊环境下出现的特殊情况,自Jenkins 1.260开始提供了禁用此特性的方法。我们可以在启动Jenkins时设置启动参数来禁用此功能。

1
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war

因为老版本的Hudson(<1.315)使用了java属性,但是processtreekiller类自此以来就一直弃用。出于兼容性原因,目前支持两个属性名称(从版本1.404开始)hudson.util.processtreekiller.disable 另外,还有一个更简便的方法是更改jenkins的processtreekiller正在寻找的环境变量build_id。这将使jenkins认为你的守护进程不是由jenkins构建而免于别杀。=""

1
BUILD_ID=dontKillMe /usr/apache/bin/httpd

解决方法

[方法一]设置Jenkins启动参数

如果我们希望彻底禁用此特性,建议使用此方法。但不提倡这么做,因为Jenkins只想大家在特殊情形下禁用次特性!
假如是通过java -jar启动Jenkins,可以带上启动参数启动。

1
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war

假如是通过Tomcat启动Jenkins,在Linux服务器上,我们可以在catalina.sh环境变量的说明后,在脚本开始前加上

1
JAVA_OPTS="$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true";

如果是Windows则是修改catalina.bat文件,添加以下内容

1
set JAVA_OPTS=%JAVA_OPTS% "-Dhudson.util.ProcessTree.disable=true"

[方法二]更改环境变量BUILD_ID

如果只是一个简单的启动,直接在Execute shell的Command输入框最开始输入BUILD_ID=DONTKILLME即可
菠菜丛林历险记
如果需要自己编写脚本,同时执行多个命令,那么就在脚本中期望构建结束后继续运行的进程启动前加上以下代码。
在Linux服务器上:

1
2
3
4
5
6
OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=DONTKILLME //"DONTKILLME"只是为了可读性才写的,可以用任何你想用的内容代替
startup.sh //根据实际情况修改启动命令的路径
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID

在Windows服务器上:

1
2
3
4
5
6
OLD_BUILD_ID=%BUILD_ID%
echo %OLD_BUILD_ID%
BUILD_ID=DONTKILLME
startup.bat //根据实际情况修改启动命令的路径
BUILD_ID=%OLD_BUILD_ID%
echo %BUILD_ID%

参考文档