【发布时间】:2014-03-28 03:59:17
【问题描述】:
我正在通过一个脚本运行一个后台进程,这个脚本在 Jenkins 开始构建时被调用。但是,jenkins 构建卡住了,在查看控制台时,它似乎正在运行该进程并等待它完成。
这个过程永远不会完成,把它当作一个服务器监听它的客户端。我触发的每个构建都会杀死服务器进程并重新启动该进程,所以我完美地处理了这种情况。
有什么办法,我可以成功构建jenkins吗?
【问题讨论】:
标签: jenkins
我正在通过一个脚本运行一个后台进程,这个脚本在 Jenkins 开始构建时被调用。但是,jenkins 构建卡住了,在查看控制台时,它似乎正在运行该进程并等待它完成。
这个过程永远不会完成,把它当作一个服务器监听它的客户端。我触发的每个构建都会杀死服务器进程并重新启动该进程,所以我完美地处理了这种情况。
有什么办法,我可以成功构建jenkins吗?
【问题讨论】:
标签: jenkins
具体细节取决于您的操作系统(您没有告诉),但 Jenkins wiki 有一个关于此的页面:https://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build
【讨论】:
您可以使用一个技巧来释放 Jenkins 线程。
您可以做的是通过 ssh 连接执行 bash 脚本并将其发送到后台,同时将进程的 pid 保存在某处以便您可以进一步检查。
命令的格式是:
ssh -n _hostname_ "_commands_ & echo \$! > \"_path_to_pid_file_\"" &
一个永无止境的程序示例:
ssh -n myhost.domain.com "tail -f /var/log/my.log & echo \$! > \"$WORKSPACE/pid\"" &
这个例子将产生一个 tail 进程,永远监听 /var/log/my.log 文件中的新变化,并将其 pid 存储在 $WORKSPACE/pid 文件中。
从 Jenkins 作业执行时,ssh 进程将立即退出,而发送到后台的命令将在指定主机中继续执行。
我这样做是为了始终保持我在构建场中运行的一项服务与存储库中它的最新代码修改保持同步。 只需有一个 ssh' 进入目标机器的作业,然后终止进程,更新服务并重新启动它。
这可能有点麻烦,但效果很好!
【讨论】: