Jenkins 任务执行完成后会kill掉的衍生进程

问题背景

在配置Jenkins进行自动化部署项目时,我们通常会在"Execute Shell"中编写脚本来停止和启动Tomcat服务。在实际操作中,遇到了一个典型的问题:

  • 现象 :Jenkins构建状态显示为成功,Shell脚本中的"停止Tomcat"命令执行正常,但"启动Tomcat"命令执行后,查看服务器进程,发现Tomcat并没有运行。
  • 日志:Jenkins控制台输出没有任何报错,一切看起来都很完美,但服务就是起不来。

原因分析

经过排查,发现这并非脚本错误,而是Jenkins的机制导致的。

Jenkins默认会在构建(Build)结束后,杀死(Kill)所有由该构建过程产生的衍生进程。

当我们通过Jenkins启动Tomcat时,Tomcat进程是Jenkins构建任务的子进程。一旦构建任务显示"完成",Jenkins为了清理环境,会强制杀掉它认为由自己启动的所有子进程,这就导致了Tomcat刚启动就被"误杀"了。

解决方案

针对这个问题,主要有两种解决方案,分别适用于不同的场景。

方案一:针对单个任务设置环境变量(推荐)

这是最灵活的方法,不需要重启Jenkins服务,也不会影响其他任务。我们只需要在启动服务的命令前,修改环境变量 BUILD_ID。Jenkins通过识别该变量来判断进程归属,修改后即可"欺骗"Jenkins,使其不杀掉该进程。

在Jenkins的"Execute Shell"配置中,修改启动命令如下:

bash 复制代码
# 设置BUILD_ID,防止Jenkins构建结束后杀死进程
BUILD_ID=DONTKILLME

# 你的启动脚本或命令
sh /path/to/tomcat/bin/startup.sh

# 或者直接写在同一行:
BUILD_ID=DONTKILLME sh /path/to/tomcat/bin/startup.sh

方案二:全局禁用进程查杀功能

如果你希望Jenkins彻底放弃"构建结束后杀子进程"这一特性,可以修改Jenkins的启动参数。此方法配置一次后,所有Job都无需再设置 BUILD_ID。

操作步骤:

1、找到Jenkins的配置文件

  • CentOS/RHEL: 通常位于 /etc/sysconfig/jenkins
  • Ubuntu/Debian: 通常位于 /etc/default/jenkins
  • Windows: 找到安装目录下的 jenkins.xml

2、在 JENKINS_JAVA_OPTIONS 或 JAVA_OPTS 参数中加入:-Dhudson.util.ProcessTree.disable=true

bash 复制代码
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.util.ProcessTree.disable=true"

3、重启Jenkins服务使配置生效:

bash 复制代码
systemctl restart jenkins
相关推荐
Decay__4 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子6 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
万联WANFLOW6 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
Ruiery8 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
Decay__10 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
江华森11 小时前
数据中心基础设施运维实战:概述与实验环境搭建
运维
迪菲赫尔曼11 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测
by2099912 小时前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
螺丝钉tina13 小时前
[Playwright][08] Upload 模块自动化:如何设计真实业务测试用例?
运维·自动化·测试用例
迪菲赫尔曼13 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测