Jenkins 后台进程


配置 Jenkins Job 的时候,after mvn package 用命令行 nohup java -jar project-1.0-SNAPSHOT.jar > /dev/null 2>&1 & 起一个 spring-boot 项目,死活不生效。

ssh 到服务器上查不到对应的进程,而直接在服务器上执行是完全 OK 的。

Google 一番后得知,这是 Jenkins 的特性。

To reliably kill processes spawned by a job during a build, Jenkins contains a bit of native code to list up such processes and kill them. This is tested on several platforms and architectures, but if you find a show-stopper problem because of this, you can disable this feature by setting a Java property named “hudson.util.ProcessTree.disable” to the value “true”. This can be done as a parameter to the “java” binary when starting Jenkins:

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

The ProcessTreeKiller takes advantage of the fact that by default a new process gets a copy of the environment variables of its spawning/creating process.

It sets a specific environment variable in the process executing the build job. Later, when the user requests to stop the build job’s process it gets a list of all processes running on the computer and their environment variables, and looks for the environment variable that it initially set for the build job’s process.

具体链接请点击 ProcessTreeKiller

大概意思是 Jenkins 是在启动 Job 的时候会给子进程设置环境变量,在结束 Job 的时候会检查进程的环境变量,如果包含 Jenkins 生成的,kill 掉。

解决方案:

  1. 启动 Jenkins 的时候加上 -Dhudson.util.ProcessTree.disable=true,也就是 java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
  2. 在后台进程前加上 BUILD_ID=dontKillMe, 也就是 BUILD_ID=dontKillMe nohup java -jar project-1.0-SNAPSHOT.jar > /dev/null 2>&1 &

除了上面两种方式,网上也有说讲nohup换成 setsid的方式,如有需要,可自行测试验证


文章作者: 小张哥
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小张哥 !
评论
 上一篇
Java8 新特性-日期api Java8 新特性-日期api
Java 8的一个新增的重要特性就是引入了新的时间和日期API,它们被包含在java.time包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。 在介绍本篇文章内容之前,我们先来讨论Java 8为什么要引入新的日期API,与之
2019-02-13
下一篇 
Java拆分shell命令成数组 Java拆分shell命令成数组
命令行拆分成string数组 原始命令如下 -p /path -d "here's my description" --verbose other args 需要的拆分结果如下 Array[0] = -p Array[1] = /pa
2019-01-29
  目录