hudson 自动deamon进程自动关闭 解决方案

标签: hudson deamon 进程 | 发表时间:2015-07-27 23:27 | 作者:lizhensan
出处:http://www.iteye.com
在Hudson Job中启动daemon进程

http://www.educity.cn/linux/1604596.html



场景

在Hudson中新建一个Job用于构建Web工程,在Job的构建脚本的最后会启动Jetty,观察发现Jetty启动之后一小段时间,进程就终止了。

环境

CentOS 6 x86_64,Hudson 3.0.1,Jetty 8,Oracle JDK 1.6

分析

刚开始在Job中启动Jetty的方式是在Ant构建脚本build.xml中调用一个shell脚本进行应用部署和容器重启。整个Job的构建过程正常,Jetty终止以后也查不到任何异常日志。

后来尝试在Job的build step中直接使用"Execute shell"去调用shell脚本,发现Job的Console output出现如下提示:

Process leaked file descriptors. See http://wiki.hudson-ci.org/display/HUDSON/Spawning+processes+from+build for more information

查看上面的链接以及Google相关资料,发现Hudson在Job构建结束之后,kill所有未终止的衍生进程。

Hudson与子进程之间使用三根管道通信(stdin/stdout/stderr),这样Hudson可以捕捉到子进程的输出。由于子进程可能往stdout写入大量数据然后立即退出,Hudson为了完整读取子进程的输出,会在用于子进程stdout的管道上等待EOF。这样,无论子进程由于什么原因退出,系统将关闭进程使用的文件描述符,因而Hudson总是可以收到EOF。

但是当子进程A在后台fork出另一个进程B的时候(比如启动一个daemon进程),情况就出现一些变化。由于进程B会继承进程A的文件描述符,如果进程B没有关闭这些描述符,即使进程A退出,这些描述符依然是打开的,Hudson将不会在相应管道上收到EOF。通常一个实现良好的daemon会关闭所有文件描述符以避免这个问题,但是总有一些实现没有遵循这个规则。在旧版本的Hudson上,这个问题将导致Job无法结束,Hudson一直在等待EOF;新版本则会打印出上面的"leaked file descriptors"警告,然后Job构建过程继续。

看来Jetty可能没有关闭继承的文件描述符,Hudson在Job构建过程结束后认为Jetty进程未终止,因而将其kill掉了。上述链接指向的Hudson wiki页面上提到可以使用daemonize工具将程序作为实现良好的daemon进程运行以避免这个问题。

在Hudson另一wiki页面上进一步描述了Hudson杀掉衍生进程的情况。Hudson在执行Job时会设置一系列环境变量,这些环境变量将被Job衍生出的进程继承。Hudson在kill衍生进程的时候会查看进程的环境变量,如果找到它之前设置的环境变量,则将其杀掉。Wiki上给出了一个简单的方法来避免进程被kill掉:修改Hudson设置的环境变量BUILD_ID的值,从而让Hudson认为此进程不是由Job的构建过程衍生的。如:

BUILD_ID=dontKillMe /usr/apache/bin/httpd

另外,在此wiki上还提到可以在启动Hudson的时候通过Java选项来关闭Hudson杀掉所有衍生进程的这个功能:

java -Dhudson.util.ProcessTreeKiller.disable=true -jar hudson.war

解决方案

1.安装daemonize包,使用daemonize命令wrap Jetty的启动指令。

daemonize ${jetty_bin} start

2.在启动Jetty之前,修改BUILD_ID环境变量。

# set BUILD_ID, or Hudson will kill any child processes

# that are started by build steps.

BUILD_ID="dontKillMe"

${jetty_bin} start


3.设置Java选项hudson.util.ProcessTreeKiller.disable为true。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hudson deamon 进程] 推荐:

hudson 自动deamon进程自动关闭 解决方案

- - 非技术 - ITeye博客
在Hudson Job中启动daemon进程. 在Hudson中新建一个Job用于构建Web工程,在Job的构建脚本的最后会启动Jetty,观察发现Jetty启动之后一小段时间,进程就终止了. 刚开始在Job中启动Jetty的方式是在Ant构建脚本build.xml中调用一个shell脚本进行应用部署和容器重启.

hudson 邮件配置

- - ITeye博客
最近在研究使用hudson 进行CI测试. 当构建失败时,自动发送邮件给指定人员. (2)点击“ Manage Hudson”. (3)点击“ Configure System”;. (5)设置job的配置,点击“Configure”进入job的配置页面,勾选E-mail Notification:.

Eclipse Foundation首次发布Hudson

- - InfoQ cn
几周之前,Eclipse Foundation 发布了著名的持续集成系统 Hudson 3.0. Hudson项目的根源可以追溯到两年前,当时从Hudson 分支出了Jenkins, 并且它本身被提议作为一个中立的托管组织加入Eclipse Foundation. 尽管在那之后,两个分支都继续发展至今,并且在分支之后还发布了Hudson 2.2.1,但此次的Hudson 3.0才是真正意义上的首次发布.

使用 Subversion、Hudson 和 Eclipse 构建持续集成系统

- - 博客 - 伯乐在线
来源: developerWorks. 持续集成系统是指持续地编译、测试、检查和部署源代码的系统. Martin Fowler 对持续集成是这样定义的 :. 持续集成是一种软件开发实践,团队开发成员经常集成它们的工作,通常每个成员每天可能会发生多次集成. 每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误.

代码质量检查工具Sonar结合hudson、maven使用

- - CSDN博客研发管理推荐文章
Sonar的安装方式有多种,可以单独安装,也可以结合maven、hudson使用;可以使用自带的内存型数据库,也可以使用自定义的数据库如mysql、oracle等. 本文介绍结合maven和hudson并使用自带的数据库,可以实现sonar的自动监测代码质量变化. 1、  下载sonar-3.0.zip包,以版本v3.0为例.

hudson不能部署项目的问题解决

- - BlogJava_首页
     在搭建持续集成服务过程中,按网上操作一步步来的,但是就是无法热部署项目到Tomcat下. 后来经过努力调试总结了解决方法:.    hudson自动部署插件: http://hudson-ci.org/downloads/plugins/deploy/ . Hudson热部署的必须关键点:.

监控进程

- - 火丁笔记
有时候,进程突然终止服务,可能是没有资源了,也可能是意外,比如说:因为 OOM 被杀;或者由于 BUG 导致崩溃;亦或者误操作等等,此时,我们需要重新启动进程. 实际上,Linux 本身的初始化系统能实现简单的功能,无论是老牌的 SysVinit,还是新潮的  Upstart 或者  Systemd 均可,但它们并不适合处理一些复杂的情况,比如说:CPU 占用超过多少就重启;或者同时管理 100 个 PHP 实现的 Worker 进程等等,如果你有类似的需求,那么可以考虑试试 Monit 和 Supervisor,相信会有不一样的感受.

Linux进程关系

- - 博客园_首页
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明. Linux的进程相互之间有一定的关系. 比如说,在 Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构. 我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程.

进程互斥与竞态

- MadFrog - 博客园-首页原创精华区
在linux编程中,经常有这样的要求:特定进程(尤其是daemon进程)有且只有一个,即特定资源只能由一进程拥有. 问题是:如何保证特定进程间的“互斥”关系(只有一个实例). 当检测到“互斥(锁定)”时,其余进程可直接退出,而无需同步. 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.

进程监控脚本

- - CSDN博客架构设计推荐文章
# 如果不存在, 就重启他. 作者:ahyswang 发表于2014-10-11 22:34:45 原文链接. 阅读:111 评论:0 查看评论.