我正在尝试从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用户完全相同的命令,但它运行正常。
有谁知道我做错了什么?如何在工作结束后让这个过程继续存在?
答案 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)。
希望这有帮助!