无法从jenkins作业生成守护进程服务器

时间:2016-06-14 10:29:29

标签: jenkins server environment-variables daemon caddy

我正在尝试从Jenkins构建作业中生成一个Web服务器,虽然作业成功,但我遇到了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的Jenkins文档,以及ProcessTreeKiller,它告诉我,我应该能够通过守护进程并设置BUILD_ID环境变量来实现这一点。别的,所以我尝试了这个:

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

然而,虽然我不再收到Process leaked file descriptors消息,但这似乎仍然在退出时杀死了进程。虽然我尝试直接在盒子上运行与Jenkins用户完全相同的命令,但它运行正常。

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

2 个答案:

答案 0 :(得分:1)

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

我通过在daemon会话中运行bash命令解决了这个问题,新BUILD_ID传递到了bash会话:

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

现在这成功地让我的守护进程继续运行。

答案 1 :(得分: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作业执行时,一旦作业完成,ssh进程将被Jenkins杀死,而发送到后台的命令将在指定主机中继续执行。

我经常这样做是为了检查和生成源代码在源代码控制下的进程(通常是git)。

希望这有帮助!