Jenkins流水线执行后Jar自动停止问题求助
Jenkins流水线启动Jar后进程自动终止的解决方法
问题根源
Jenkins流水线在阶段结束时,会终止该阶段创建的所有子进程(包括后台启动的Java进程)。这是因为Jenkins会将阶段内的所有进程纳入同一个进程组,阶段完成后发送SIGHUP信号清理整个进程组,单纯的nohup无法完全脱离这个进程组,导致Jar进程被连带终止。
解决方案
修改启动脚本,让进程彻底脱离Jenkins的进程组
推荐使用setsid命令启动Jar,它会创建新的会话和进程组,完全脱离Jenkins的控制:#!/bin/bash # 先确保日志目录存在,避免启动失败 mkdir -p log # 使用setsid启动进程,同时重定向所有输入输出 setsid java -jar build/libs/leJar.jar > log/leJar.log 2>&1 < /dev/null &或者优化原有的
nohup命令,加上标准输入重定向到/dev/null,避免Jenkins终端的影响:#!/bin/bash mkdir -p log nohup java -jar build/libs/leJar.jar > log/leJar.log 2>&1 < /dev/null &用disown命令移除进程的作业控制
如果坚持使用nohup,可以在启动后用disown将进程从Jenkins的作业列表中移除,避免被清理:#!/bin/bash mkdir -p log nohup java -jar build/libs/leJar.jar > log/leJar.log 2>&1 & # 移除最近的后台进程的作业控制 disown $!
补充说明
加sleep时Jar能运行的原因:sleep会让当前阶段持续,Jenkins还没触发进程清理;一旦阶段结束,Jenkins就会清理该阶段的所有子进程,包括后台的Jar进程。
内容的提问来源于stack exchange,提问作者Cristian M
相关产品推荐
相关产品推荐

