Jenkins Job中衍生进程存活难题及解决方案

news/2024/11/15 9:19:32/文章来源:https://www.cnblogs.com/test-gang/p/18545318

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和子进程通过三根管道(stdinstdoutstderr)进行通信,以捕获子进程的输出。由于子进程可能向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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833854.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 错误1055 永久解决方案

详情见:https://www.cnblogs.com/haoyul/p/9882853.html

生产订单修改记录报表

1、写在前面 生产订单修改记录报表对于项目上并不陌生。通常会在增强中编写逻辑来判断生产订单主要信息是否有变更,有则保存到日志表,并通过查询报表展示,帮助用户查看生产订单发生的修改。 本文档的代码,只是对现有逻辑的一些优化,通过配置表的方式,设置监控字段,灵活监…

manim边做边学--圆锥

Cone是Manim中专门用于创建和操控锥形几何对象的类。 Cone允许用户定义锥体的底面半径、高度、颜色、不透明度等属性,并提供了一系列方法来操控这个锥体,如移动、缩放、旋转等。 通过这些属性和方法,用户可以灵活地创建出符合自己需求的锥形对象,并将其融入到动画或演示中。…

远光天鹿:重塑数字化时代软件设计新体验

在当今数字化时代,用户体验已成为衡量软件产品成功与否的关键指标。然而,传统的软件设计模式存在流程繁琐、效率低下、资源浪费等弊端,严重制约了产品创新的步伐。为此,远光软件创新推出高效智能的用户体验创新平台——远光天鹿。传统设计模式的挑战 传统软件设计模式涵盖需…

速度与安全并重:交通运输业异地跨地区文件传输的创新方案!

在交通运输业中,总部需要异地跨地区文件传输给分支机构的文件种类繁多,这些文件通常涵盖公司的战略规划、运营指导、规章制度、业务数据等多个方面。以下是一些常见的总部需要异地跨地区文件传输的文件类型: 1.战略规划与考核文件:公司长期发展规划、年度经营计划、绩效考核…

Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图

一、前言说明 已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有。无论哪个地图厂家,提供的接口都是没有唯一标识参数的,也就类似于学号,这就是需要自己主动定一个…

网站换主页在哪里修改

要修改网站的主页,通常需要访问网站的后台管理系统或直接编辑服务器上的文件。具体步骤取决于你的网站是如何构建和托管的。以下是一些常见的方法:使用CMS(内容管理系统):登录到你的CMS后台(如WordPress, Joomla, Drupal等)。 导航到“外观”或“主题”部分,选择当前使…

织梦数据库配置文件数据库损坏:尝试修复数据库

数据库损坏:尝试修复数据库:REPAIR TABLE table_name;如果无法修复,考虑从备份恢复数据库。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理…

一个asp网站的mdb数据库修改,如何在Access数据库中修改ASP网站的数据

Access数据库是一种常用的桌面数据库,常用于小型网站的数据管理。以下是具体步骤:打开Access数据库:打开Microsoft Access应用程序。 导入或打开现有的Access数据库文件(.mdb或.accdb)。导航到数据表:在Access主界面中,选择“表”视图。 找到需要修改的数据表,双击打开…

如何修改我的网站页面,如何在网站后台或代码编辑器中修改网站页面内容

修改网站页面内容可以更新信息和提升用户体验。以下是修改网站页面内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入内容管理:登录后,点击顶部菜单栏中的“内容”或“文章”。 选择…

修改网站上的页面,如何优化网页设计与功能

修改网站上的页面不仅仅是更改文本或图片,更重要的是优化用户体验和网站性能。以下是一些关键步骤:分析用户需求:通过用户调研或数据分析了解用户偏好,据此调整页面布局和内容。 提高加载速度:优化图片大小,减少HTTP请求,使用CDN加速等方法提升页面加载速度。 响应式设计…

ETL之kettle 医疗行业高级陪伴群 第一课

1、里程碑 很高兴的和可爱的小伙伴们一起宣布,我们的医疗特工队正式成立了。确切的说是ETL医疗高级陪伴群于2024-11-14日12时22分正式成立。 2、此群的前身 回忆过去我刚开始接触kettle时资料甚少,遇到问题啃英文官方文档,遇到不懂的英文靠Ai翻译,慢慢的能够驾驭kettle,能…