【问题标题】:Can't spawn daemon server from jenkins job无法从詹金斯工作中生成守护进程服务器
【发布时间】:2016-06-14 10:29:29
【问题描述】:

我正在尝试从 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 buildProcessTreeKiller 的 Jenkins 文档,它告诉我应该能够通过守护进程并将 BUILD_ID 环境变量设置为其他值来实现这一点,所以我试过这个:

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

但是,尽管我不再收到 Process leaked file descriptors 消息,但这似乎仍然会在退出时杀死进程。虽然我尝试直接在盒子上运行与 Jenkins 用户完全相同的命令,但效果很好。

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

【问题讨论】:

    标签: jenkins server environment-variables daemon caddy


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      您可以做的是通过 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\"" &
      

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

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

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 2016-11-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 2013-04-02
        相关资源
        最近更新 更多