Jenkins启动守护进程后台持续运行

在使用jenkins的时候,我们可能有这样的需求,希望jenkins启动的进程在后台持续运行,不阻塞jenkins的构建。1.136版本之前的jenkins不满足这种需求,1.136之后的版本支持。

为什么jenkins的进程是阻塞的?

jenkins主进程和它所启动的子进程通过stdin、stdout、stderr这三个管道相互联系。也因为这样,jenkins可以打印所有进程的日志。子进程可能打印海量的日志,然后结束,但是jenkins主进程要保证所有的子进程通道关闭后,才能认为本次build结束。jenkins只有等到了EOF,才会结束。

一个进程结束后(无论什么原因),操作系统就会关闭这个进程相关的文件描述符。所以即使进程没有关闭stdin、stderr,jenkins也会收到EOF。

主进程开启子进程,子进程会继承主进程所有的文件描述符,包括stdin、stderr通道。如果子进程需要持续运行(守护进程)。一旦主进程忘记关闭子进程,那么jenkins即使在主进程结束后,也不会收到EOF,因为子进程还保留着所有的文件描述符。

一个正常的守护进程会关闭它所有的文件描述符,来避免上述情况。但是有时候,我们就是希望jenkins开启子进程持续运行。

解决办法

unix

unix中使用daemonize命令,如果机器上没有此命令,可以安装下http://software.clapper.org/daemonize/

daemonize -E BUILD_ID=dontKillMe -o some.log -c /home/User/victor  /home/User/victor/test.sh

-o :指定日志文件,-c :命令执行前切换到该路径,最后是要执行脚本的绝对路径。

windows

windows中可以使用at和SCHTASKS命令来实现后台运行。
如果jenkins使用的是ant构建,增加下面的代码即可(执行bat脚本):

<scriptdef name="get-next-minute" language="beanshell">
    <attribute name="property" />

    date = new java.text.SimpleDateFormat("HH:mm").format(new Date(System.currentTimeMillis() + 60000));
    project.setProperty(attributes.get("property"), date);
</scriptdef>

<get-next-minute property="next-minute" />
<exec executable="at">
    <arg value="${next-minute}" />
    <arg value="/interactive" />
    <arg value="${jboss.home}\bin\run.bat" />
</exec>

使用ant构建,执行js脚本:

继续阅读->

时间: 2024-10-03 19:24:34

Jenkins启动守护进程后台持续运行的相关文章

程序自启动及后台持续运行的研究(voip和GPS方式)

1,voip方式    1)首先要修改应用的plist配置,添加下面的设置:        Application does not run in background: NO        Required background modes: VOIP    注:添加这些配置之后,程序重启解锁就会自动运行application:                                  didFinishLaunchingWithOptions方法.    2)主要测试代码:- (BO

hadoop启动守护进程报JAVA_HOME is not set and could not be found

hadoop启动守护进程 sbin/start-dfs.sh 报如下错误:JAVA_HOME is not set and could not be found 解决办法(JAVA_HOME修改为具体的路径):vim etc/hadoop/hadoop-env.sh

Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息

一.什么是yii2-queue? Yii2-queue是Yii2.0 PHP框架下一个消息队列拓展插件,支持基于DB, Redis, RabbitMQ, AMQP, Beanstalk 和 Gearman等.yii2-queue GitHub地址:https://github.com/yiisoft/yii2-queue 二.如何安装yii2-queue? php composer.phar require --prefer-dist yiisoft/yii2-queue 三.Linux sys

spring boot jar 进程自动停止,自动终止,不能后台持续运行

第一次部署spring boot 到linux上,用命令java -jar **.jar,发现应用自动退出,进程停止了.后来发现要不挂断的执行命令,忽略所有的挂断信号,用以下命令解决 nohup java -jar **.jar& nohup: 不挂断的执行命令,忽略所有的挂断信号. 运行后台命令 最后加 & 在jar目录下会生成一个nohup.out文件,默认的log输出到这里.

MONGO启动 守护进程

nohup /app/mongodb/bin/mongod -f /app/mongodb/mongodb.conf  --dbpath=/app/mongodb/db/ --bind_ip_all >start.log& nohup /app/mongodb/bin/mongod   启动程序 -f /app/mongodb/mongodb.conf   指定配置文件(配置文件中fork=true) --dbpath=/app/mongodb/db/ 指定保存路径 --bind_ip_al

错误:无法启动守护进程:不能为对象堆预留足够的空间。

Error:Unable to start the daemon process: could not reserve enough space for object heap.Please assign more memory to Gradle in the project's gradle.properties file.For example, the following line, in the gradle.properties file, sets the maximum Java

用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)

消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验. 为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品. 消息队列说白了就是一个最简单的先进先出队列,队列的一个成员就是一段文本.正是因为消息队列实在太简单了,当拿着消息

转:linux守护进程的启动方法

Linux 守护进程的启动方法 作者: 阮一峰 日期: 2016年2月28日 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res)

Linux守护进程的启动方法

导读 “守护进程”(daemon)就是一直在后台运行的进程(daemon),通常在系统启动时一同把守护进程启动起来,本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行,这并不容易,举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'