【Jenkins】execute shell启动的进程在结束的时候被杀死

版权声明:本文为博主原创文章,未经博主允许不得转载。谢谢您的关注... https://blog.csdn.net/u013948858/article/details/87639533

ProcessTreeKiller此功能自1.260起可用

为了可靠地终止在构建期间由作业生成的进程,Jenkins包含一些本机代码来列出这些进程并将其终止。这在几个平台和体系结构上进行了测试,但如果您因此发现了show-stopper问题,则可以通过将名为“hudson.util.ProcessTree.disable”的Java属性设置为值“true”来禁用此功能。

这可以在启动Jenkins时作为“java”二进制文件的参数完成:

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

根据您运行容器的方式,这可能会有所不同。在分布式构建环境中,需要在从属JVM上设置此系统属性。

较旧版本的Hudson(<1.315)使用了Java属性,但之后已经取消了ProcessTreeKiller类。
出于兼容性原因,目前支持两个属性名称(从版本1.404开始)。
hudson.util.ProcessTreeKiller.disable

其操作原理?

ProcessTreeKiller利用了这样一个事实:默认情况下,新进程获取其产生/创建过程的环境变量的副本。
它在执行构建作业的进程中设置特定的环境变量。稍后,当用户请求停止构建作业的进程时,它会获取计算机上运行的所有进程及其环境变量的列表,并查找最初为构建作业的进程设置的环境变量。然后终止在其环境中具有该环境变量的每个作业。

如果你的构建想让守护进程后台运行?

实现这一目标的一种便捷方法是更改​​Jenkins的ProcessTreeKiller正在寻找的环境变量BUILD_ID。这将导致Jenkins假设你的守护进程不是由Jenkins构建产生的。例如:

BUILD_ID=dontKillMe /usr/apache/bin/httpd

备注:

1.如果在同一台机器上安装了多个Hudson服务器,同样有效

2.如果Jenkins Pipeline使用JENKINS_NODE_COOKIE而不是BUILD_ID

解决方案:

1:通过Jenkins提供的启动参数禁用杀死子进程的特性(不建议)

使用java -jar启动Jenkins服务,添加参数 `-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

2:修改Jenkins的环境变量BUILD_ID(建议 execute shell)

BUILD_ID=DONTKILLME
mvn clean package -Dmaven.test.skip=true

猜你喜欢

转载自blog.csdn.net/u013948858/article/details/87639533
今日推荐