通过远程执行sh脚本,执行如下命令:
java -jar xxxxx.jar
通过判断返回值发现命令执行成功,但是进入服务器后使用 jps -l 并未发现相关的java程序启动。
经过查阅资料发现,Jenkins 有一个 ProcessTreeKiller 特性,Jenkins有一些特殊的方法显示能够看到进程构建过程中产生的进程,并结束掉它们。如实是通过 java -jar jenkins.war 启动的,可以添加如下参数全局禁用该功能(推荐)。
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
也可以通过加入环境变量的方式解决:
# 普通项目使用BUILD_ID
export BUILD_ID=dontKillMe /usr/bin/java -jar xxx.jar
# 流水线使用JENKINS_NODE_COOKIE
export JENKINS_NODE_COOKIE=dontKillMe /usr/bin/java -jar xxx.jar
ProcessTreeKiller工作原理解读
在Jenkins创建新的进程的时候会获得并创建环境变量副本,在进程执行过程中会创建一个特殊的环境变量,在任务结束的时候,Jenkins会获取到这个特殊的环境变量,并以此区分那些是构建时产生的进程,在任务结束的时候结束掉该进程。