在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。
分享到:
相关推荐
Hudson是一款开源的持续集成工具,用于自动化各种任务,包括构建、测试和部署软件。本文档将深入探讨Hudson的安装、配置、使用方法以及如何搭建远程自动构建和daily_build系统。 1. **Hudson安装** 安装Hudson通常...
【描述】:“CentOS环境下的Hudson自动化部署报告详细阐述了如何在Linux服务器上配置和使用Hudson进行自动化部署,包括安装CentOS、安装JDK、设置Hudson环境、配置项目、创建工作流以及解决可能遇到的问题。...
hudson插件加载失败解决方案 本文档将讨论hudson插件加载失败的解决方案,涵盖hudson版本、环境信息、插件安装、Tomcat日志分析、问题排查等方面的知识点。 一、hudson版本信息 hudson版本:hudson-2.2.1.war ...
【标题】"Hudson SVN Maven 自动构建"指的是在持续集成环境中使用Hudson(现在称为Jenkins)作为工具,结合Subversion(SVN)作为版本控制系统,Maven作为项目管理和构建工具,实现代码的自动构建过程。这个流程的...
【Hudson + Maven + SVN 简单自动化部署】 在软件开发过程中,自动化部署是提高效率和减少错误的关键环节。本文将详细介绍如何利用Hudson、Maven和SVN实现简单的自动化部署,这种方法已经在实际生产环境中得到了...
hudson.war是基于Java研发的一款持续集成工具的安装包,hudson是一个可以扩展的持续集成引擎,主要是用它来监控一些定时执行的任务、持续、自动地构建/测试软件项目,有需要的欢迎下载使用。 hudson下载,放在tomcat...
【Hudson + Sonar 自动部署配置】 在 IT 领域中,自动化部署和质量分析是提升开发效率和保证代码质量的关键环节。Hudson 和 Sonar 是两款强大的工具,分别用于持续集成和代码质量管理。本文将详细介绍如何配置 ...
【标题】"Hudson+Maven+SVN 自动部署" 在现代软件开发流程中,自动化构建和部署是提升效率和质量的关键环节。Hudson、Maven和SVN(Subversion)是三个重要的工具,它们共同协作可以实现无缝的持续集成和自动部署。 ...
总之,Selenium、JUnit和Hudson的结合提供了一种高效、灵活的自动化测试解决方案。通过合理的环境配置和脚本编写,可以构建出稳定且适应性强的自动化测试框架,极大地提升了测试效率和测试覆盖率。在实际应用中,...
2. 发送一个信号到Hudson进程,让其优雅地关闭,处理任何未完成的任务和清理资源。 3. 如果进程没有在预设时间内关闭,可能采取强制杀掉进程的措施。 使用这两个脚本时,你需要根据你的系统环境和Hudson安装位置...
自动构建是指通过自动化工具,如Hudson,来自动执行编译、打包、测试等步骤,使得开发者可以快速验证代码更改的效果,同时减少手动操作带来的错误。本文将深入探讨Hudson这个持续集成工具及其相关插件,包括FindBugs...
Hudson 是一款强大的持续集成工具,主要负责自动化软件的构建、测试和部署任务。它的核心功能包括持续构建/测试、RSS/邮件/即时消息通知、Junit/TestNG 测试报告生成、分布式构建支持以及丰富的插件体系。Hudson 的...
《Hudson持续集成实战》是一本专注于自动化部署的教程,旨在帮助读者掌握使用Hudson进行持续集成的关键技术和实践策略。Hudson,作为一个开源的持续集成工具,被广泛应用于软件开发过程中,以提升效率,减少错误,并...
Hudson是一个开源的持续集成(CI)服务器,它提供了一种自动化构建、测试和部署软件的解决方案。Hudson以其简单易用和丰富的插件功能而受到赞誉,使得项目管理和配置变得更加高效。下面将详细介绍Hudson的特性、搭建...