2016-06-14 127 views
1

我想从Jenkins构建作业产生一个web服务器,虽然作业成功,但我遇到了Jenkins在作业退出时自动杀死后台作业的问题。无法从jenkins作业产生守护进程服务器

+ caddy -port 26748 & 
Activating privacy features... done. 
:26748 
Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information 
Finished: SUCCESS 

我读了詹金斯文档中关于spawning processes from build,并且还对ProcessTreeKiller,它告诉我,我应该能够通过daemonizing过程和BUILD_ID环境变量设置为别的东西来实现这一点,所以我想这:

BUILD_ID=dontKillMe daemon --env="BUILD_ID=dontKillMe" --name="my-process" -- caddy -root `pwd` -port 26748 

然而,尽管我不再得到Process leaked file descriptors消息,这似乎仍然被杀死在退出的过程。尽管我试图直接在框上运行与Jenkins用户完全相同的命令,但它工作正常。

有谁知道我在做什么错?在工作结束后如何才能让这个过程继续下去?

回答

1

我的问题是BUILD_ID需要专门为daemon进程设置,而不是它的子进程。出于某种原因,BUILD_ID=dontkillme daemon没有这样做有效。

我解决了这个用通过对bash会议通过的新BUILD_ID一个bash会话中运行daemon命令:

BUILD_ID=dontKillMe bash -c "daemon --name="my-process" --command 'caddy -root `pwd` -port 26748'" 

这现在已经成功地离开我的守护进程运行。

0

有一个技巧,你可以做,但它有点麻烦,但有效。

你可以做的是通过ssh连接执行bash脚本并将其发送到后台,同时将进程的pid保存在某处,以便进一步进行检查。

该命令的格式将是:

ssh -n _hostname_ "_commands_ & echo \$! > \"_path_to_pid_file_\"" & 

实施例与一个永无止境程序:

ssh -n mycomputer.mydomain.com "tail -f /var/log/my.log & echo \$! > \"$WORKSPACE/pid\"" & 

这个例子将产生尾过程监听永远为在/ var新的变化/log/my.log文件并将其pid存储在$ WORKSPACE/pid文件中。

当从Jenkins作业执行时,一旦作业完成,Jenkins将终止ssh进程,而发送到后台的命令将继续在指定主机中执行。

我这样做通常用于检查和产卵源代码在源代码控制下(通常是git)的进程。

希望这会有所帮助!