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

Jenkins Job中衍生进程存活难题及解决方案的更多相关文章

  1. 【转】解决jenkins自动杀掉衍生进程

    在执行 shell输入框中加入BUILD_ID=dontKillMe ,即可防止jenkins杀死启动的进程 export BUILD_ID=dontKillMe PROJECT_LOCATION=& ...

  2. 修改Jenkins启动衍生进程的生命周期

    Jenkins+jmeter 多线程测试java接口时爆错,导致无法生成html报告. 先介绍下场景: 在Jenkins中新建了一个Job,假设你在一些列Build Step之前/之后,启动了一个进程 ...

  3. jenkins 杀死衍生进程

    解决方法-1: 在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins衍生进程 解决方法-2: 修改/etc/sysconfig/jenkins配置,在 ...

  4. jenkins默认在build结束后会kill掉所有的衍生进程

    在使用jenkins进行自动化部署服务的过程中,发现调用服务器的shell命令无法正常启动tomcat,但是构建日志显示是成功执行的,而手动在服务器却是可以正常启动tomcat. 原因:jenkins ...

  5. python中的进程、线程(threading、multiprocessing、Queue、subprocess)

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  6. 【转】关于loadrunner中设置进程和线程的区别

    loadrunner中,在进行运行设置中有一项选择,是按进程运行Vuser或按线程运行Vuser?下面进行分别来讲: 1.按进程运行Vuser:Controller将使用驱动程序mdrv运行Vuser ...

  7. 在python程序中的进程操作

    multiprocess模块 multiprocess不是一个模块而是python中一个操作.管理进程的包. 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所 ...

  8. Python 中的进程与 锁

    理论知识 操作系统背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操 ...

  9. Python程序中的进程操作-开启多进程(multiprocess.process)

    目录 一.multiprocess模块 二.multiprocess.process模块 三.process模块介绍 3.1 方法介绍 3.2 属性介绍 3.3 在windows中使用process模 ...

  10. 29、Python程序中的进程操作(multiprocess.process)

    一.multiprocess模块 multiprocess不是一个模块而是python中一个操作.管理进程的包. 子模块分为四个部分: 创建进程部分 进程同步部分 进程池部分 进程之间数据共享 二.m ...

随机推荐

  1. (Redis基础教程之五)如何在Redis中操作字符串

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  2. 推荐给初级Java程序员的3本进阶书

    ImportNew 注: 原作者在这篇文章中介绍3本不错的技术书籍.作者认为这些书籍对新手或者学生而言尤其有帮助.通过一些基础性的教程入门后,我们可以使用Java做基础性的编程.然而,当我们需要从初级 ...

  3. Django之项目部署

    1.线上部署一般会使用https的方式进行部署,本身django框架是不支持的,所以需要... 1)安装扩展 pip install django-extensions django-werkzeug ...

  4. Graylog之告警

    官方文档:https://docs.graylog.org/en/3.0/index.html 前面我们已经了解了Graylog的搭建,以及日志的接入方法.我们知道graylog可以将收集的的日志通过 ...

  5. 理解Java FutureTask

    FutureTask实现的功能 它的功能就像他继承的接口一样:Runnable与Future.他实现了一套机制将两者连接起来. Runnable主要方法是run(),用于执行一些程序. Future主 ...

  6. Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询

    以此案例举例: 使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按 ...

  7. 对象存储 AVIF 图片压缩,邀您参与免费内测!

    对象存储 AVIF 图片压缩免费内测正式开放!AVIF 作为压缩图片中的新主力军,都有哪些特点呢?通过对象存储又要如何使用 AVIF 压缩呢?这篇文章将深入浅出的为您介绍~ ​具体介绍 现在硬件设备越 ...

  8. 【XML】学习笔记第三章-namesapce

    目录 命名空间 命名空间概述 命名空间语法 命名空间的声明 命名空间作用域 对命名空间的使用 元素对命名空间的使用 属性对命名空间的使用 DTD对命名空间的支持 命名空间 命名空间概述 标记中出现了同 ...

  9. 【C#】【报错解决】分析器错误消息: 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider

    1.工具->NuGet包管理器->程序包管理控制台 2.在程序包管理控制台中输入 PM> Install-Package Microsoft.CodeDom.Providers.Do ...

  10. 使用archlinux AUR源下载安装的方法 以及 解决makepkg网络连接超时(time out)的问题

    1.使用archlinux(AUR)源下载安装软件/驱动的方式 2.解决使用此方时无法通过网络下载资源文件的问题(网络连接超时/time out) 1.使用archlinux(AUR)源下载安装软件/ ...