为了可靠地终止在构建期间由作业生成的进程,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