1

我正在尝试从 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

我阅读了关于从 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 用户完全相同的命令,但效果很好。

有谁知道我做错了什么?工作退出后如何让这个过程继续下去?

4

2 回答 2

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'"

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

于 2016-06-14T12:45:59.433 回答
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)的进程。

希望这可以帮助!

于 2017-02-02T12:02:32.003 回答