Jenkins Job中衍生进程存活难题及解决方案
Jenkins Job中衍生进程存活难题及解决方案
场景介绍
在Jenkins中创建了一个Job,假设你在一系列Build Step之前或之后启动了一个进程,例如启动一个Jboss进程。在Build完成后,你查看Console Output,发现显示启动成功,甚至PID也显示了。然而,当你到后台检查时,发现这个进程实际上并不存在,并没有启动成功。
早期Hudson版本的问题提示
如果你使用的是较早的Hudson版本(Ver 1.136),并且在页面中的Build Session(如Execute Shell)中直接执行命令,你可能会看到如下提示:
Process leaked file descriptors. See http://wiki.hudson-ci.org/display/HUDSON/Spawning+processes+from+build for more information.
问题分析
这个问题的根本原因在于文件描述符的泄漏和继承。Jenkins和子进程通过三根管道(stdin、stdout、stderr)进行通信,以捕获子进程的输出。由于子进程可能向stdout写入大量数据然后立即退出,Jenkins需要在子进程stdout的管道上等待EOF(文件结束符)。
然而,当子进程在后台fork出另一个进程(如daemon)时,情况就复杂了。这个daemon进程会继承父进程的所有文件描述符,包括与Jenkins连接的stdout/stderr管道的写入端。如果daemon进程没有关闭这些描述符,即使子进程退出,Jenkins也不会在相应管道上收到EOF,导致Jenkins认为子进程仍在运行,并在Job结束后将其kill掉。
解决办法
针对这个问题,有几种解决办法:
使用daemonize工具
在Unix系统上,你可以使用daemonize工具将程序作为实现良好的daemon进程运行。安装daemonize工具包,并使用daemonize命令包装相应进程的启动指令,例如:
daemonize ${your.process} start
此外,对于Windows平台,也有相应的解决办法,具体可参考Jenkins官方Wiki。
重设环境变量BUILD_ID
Jenkins的ProcessTreeKiller会检查进程的环境变量,如果找到它之前设置的环境变量(如BUILD_ID),就会将其杀掉。因此,你可以通过改变BUILD_ID的值来避免进程被Jenkins杀掉。例如:
BUILD_ID=dontKillMe
或者,在Job的参数触发器中添加一个字符串参数,变量名为BUILD_ID,值为dontKillMe。
启动时添加禁用参数
这是最彻底且不需要逐个配置Job的解决办法。你可以在启动Jenkins时通过Java选项来关闭Jenkins杀掉所有衍生进程的功能:
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
这样,Jenkins就不会再杀掉由Job衍生的进程了。
总结
通过以上方法,你可以有效地解决Jenkins在Job构建结束后kill掉衍生进程的问题。选择哪种方法取决于你的具体需求和系统环境。
参考资料
https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller
Jenkins Job中衍生进程存活难题及解决方案的更多相关文章
- 【转】解决jenkins自动杀掉衍生进程
在执行 shell输入框中加入BUILD_ID=dontKillMe ,即可防止jenkins杀死启动的进程 export BUILD_ID=dontKillMe PROJECT_LOCATION=& ...
- 修改Jenkins启动衍生进程的生命周期
Jenkins+jmeter 多线程测试java接口时爆错,导致无法生成html报告. 先介绍下场景: 在Jenkins中新建了一个Job,假设你在一些列Build Step之前/之后,启动了一个进程 ...
- jenkins 杀死衍生进程
解决方法-1: 在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins衍生进程 解决方法-2: 修改/etc/sysconfig/jenkins配置,在 ...
- jenkins默认在build结束后会kill掉所有的衍生进程
在使用jenkins进行自动化部署服务的过程中,发现调用服务器的shell命令无法正常启动tomcat,但是构建日志显示是成功执行的,而手动在服务器却是可以正常启动tomcat. 原因:jenkins ...
- python中的进程、线程(threading、multiprocessing、Queue、subprocess)
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- 【转】关于loadrunner中设置进程和线程的区别
loadrunner中,在进行运行设置中有一项选择,是按进程运行Vuser或按线程运行Vuser?下面进行分别来讲: 1.按进程运行Vuser:Controller将使用驱动程序mdrv运行Vuser ...
- 在python程序中的进程操作
multiprocess模块 multiprocess不是一个模块而是python中一个操作.管理进程的包. 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所 ...
- Python 中的进程与 锁
理论知识 操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操 ...
- Python程序中的进程操作-开启多进程(multiprocess.process)
目录 一.multiprocess模块 二.multiprocess.process模块 三.process模块介绍 3.1 方法介绍 3.2 属性介绍 3.3 在windows中使用process模 ...
- 29、Python程序中的进程操作(multiprocess.process)
一.multiprocess模块 multiprocess不是一个模块而是python中一个操作.管理进程的包. 子模块分为四个部分: 创建进程部分 进程同步部分 进程池部分 进程之间数据共享 二.m ...
随机推荐
- PHP开源项目之YOURLS
YOURLS是一个开源的PHP的程序,可以利用它来构建属于自己的URL缩短服务,YOURLS还可以集成到WordPress博客中使用. YOURLS 的主要功能: 公开的(Public 任何人都可以用 ...
- Educational Codeforces Round 102 (Rated for Div
Educational Codeforces Round 102 (Rated for Div. 2) No More Inversions 给定\(k\),序列\(a\)长度为\(n\):\(1,2 ...
- Mybatis【18】-- Mybatis自关联多对一查询方式
注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-14-oneself-many2one,需要自取, ...
- Spring基于注解实现 AOP 切面功能
一.Spring AOP 注解概述 1.Spring 的 AOP 功能除了在配置文件中配置一大堆的配置,比如切入点.表达式.通知等等以外,使用注解的方式更为方便快捷,特别是 Spring boot 出 ...
- 物联网cc2530按键长按短按分别控制亮灯亮灭(详细版)
一.在编辑程序之前搭建其基本框架,如下所示 #include <iocc2530.h> void main(void) { halBoardInit(); while(1) { } } ...
- 『玩转Streamlit』--片段Fragments
在 Streamlit 应用开发中,Fragments组件是一种用于更精细地控制页面元素更新和显示顺序的工具. 它允许开发者将内容分解成多个小的片段,这些片段可以按照特定的顺序或者逻辑进行更新,而不是 ...
- 基于知识图谱的医疗问答系统(dockerfile+docker-compose)
目录 一.搭建 Neo4j 图数据库 1.方式选择 2.Dockerfile+docker-compose部署neo4j容器 2.1.更新 yum 镜像源 2.2.安装 docker-ce 社区版 2 ...
- 使用 Web Compiler 2022+
使用 Web Compiler 2022+ Web Compiler 2022+ for Visual Studio 2022 Web Compiler for Visual Studio 2019 ...
- [springboot] mvn编译实现代码混淆
pom配置 <project> <build> <plugins> <plugin> <groupId>org.spri ...
- Qt/C++入门基础学习001-绘图基础
这一节介绍 Qt 的绘图基础知识,我们都知道,Qt 里绘图使用的是 QPainter,但是首先需要弄明白:在什么上绘图和在哪里绘图,然后才是怎么绘图,我们就围绕这几个问题来展开. 在什么上绘图 The ...