首页 > 系统相关 >Jenkins Job中衍生进程存活难题及解决方案

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

时间:2024-11-15 09:07:34浏览次数:1  
标签:存活 Job daemonize BUILD 进程 Jenkins ID

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

标签:存活,Job,daemonize,BUILD,进程,Jenkins,ID
From: https://www.cnblogs.com/test-gang/p/18545318

相关文章

  • 【Jenkins】如何优化Jenkins的性能?
    优化Jenkins的性能可以从多个方面着手,包括但不限于硬件资源、Jenkins配置、插件管理和流水线设计。下面是一些具体的优化策略,以及如何实施这些策略的示例。1.升级硬件资源增加内存:Jenkins运行时需要足够的内存来处理构建任务。如果Jenkins频繁出现内存不足的情况,应该考虑......
  • jenkins打包报错Build step 'Execute shell' marked build as failure Finished: FA
    1、jenkins打包报错  处理方式1、在步骤“Executeshell”命令最上面添加(还是报错)#!/bin/bash2、设置全局配置,添加键和值(还是报错)键:LANG值:zh.CH.UTF-83、设置全局配置,添加键和值(还是报错)键:JAVA_TOOL_OPTIONS值:-Dfile.encoding=UTF-84、cat /usr/lib/systemd/sys......
  • jenkins环境搭建
    linux安装maven及环境配置一、maven下载地址,安装binaries版本https://dlcdn.apache.org/maven/maven-3/3.8.8/ 或者使用wget命令命令:wgethttps://https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-src.tar.gz 二、解压命令:tar-zxvf apache-m......
  • VS Code Jenkins Pipeline 开发的插件推荐
    VSCode有一些专门为JenkinsPipeline开发的插件,可以提供代码高亮、自动补全、语法检查等功能。以下是一些常用的插件:1.JenkinsPipelineLinterConnector功能:该插件允许你在VSCode中编写JenkinsPipeline并直接连接到Jenkins服务器进行语法检查。它会自动将Pipel......
  • CICD05 Jenkins流水线, 代码质量检查sonarqube ubuntu使用
    3.2.3.5Pipeline简单案例#范例:脚本式node{stage('Getcode'){echo'获取代码'//gitclone}stage('Build'){echo'构建项目代码'}stage('Test'){echo'......
  • CICD03 Jenkins对golang项目构建, 结合ansible, 构建通知, 自动化构建(定时,webhook),
    2.7.2基于Maven风格的任务构建基于WAR包运行Tomcat服务器JAVA项目maven配置繁琐,功能固定不灵活,不如自由风格好用,这里推荐用自由风格脚本实现更好目前最高依赖到tomcat9,更高版本的tomcat不支持2.7.2.2安装tomcat服务器和配置#在gitlab新建java项目(此项目使用JD......
  • CICD04 Jenkins容器化CICD实现及分布式构建, 流水线Pipeline ubuntu使用
    2.14.3案例:基于Docker插件实现自由风格任务实现Docker镜像制作不如前面的直接脚本编写灵活2.14.3.2安装插件docker-build-stepjenkins上安装docker-build-step插件#选择jenkins使用的docker服务#左侧系统管理,右侧系统配置,DockerBuilder下DockerURL输入un......
  • XXL JOB DockerCompose部署
    官网给的方式是Docker命令启动,但是用起来太麻烦了,所以用DockerCompose简化部署创建数据库,导入SQLSQL脚本位置为/xxl-job/doc/db/tables_xxl_job.sqlhttps://raw.githubusercontent.com/xuxueli/xxl-job/refs/heads/master/doc/db/tables_xxl_job.sql编写DockerComposev......
  • CICD02 Jenkins安装,备份还原, 实现CICD核心功能 ubuntu使用
    DevOps之CICD服务器Jenkins1Jenkins部署与基本配置1.2Jenkins安装和启动1.2.1Jenkins的安装Jenkins支持多种安装方法1.包安装2.JAVA的WAR文件#要手动配置,不太方便3.容器运行#系统要求最低推荐配置:1.256MB可用内存2.1GB可用磁盘空间(作为一个......
  • 【Jenkins】如何在Pipeline中使用环境变量?
    在JenkinsPipeline中使用环境变量是一种常见的做法,可以帮助你在不同的构建步骤之间传递信息,或者为你的构建提供可配置的选项。环境变量可以在Jenkins的系统级别定义,也可以在Pipeline脚本中直接定义。在Pipeline中使用环境变量1.系统级别的环境变量你可以在Jenkins的全......