You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:59:54