我在Jenkins Ant Execution Plugin中有一个Ant任务,作为Post Build Step,在我们的一个服务器中远程运行shell脚本。 shell脚本在后台启动java进程。当我直接在服务器上执行shell脚本时,它会在后台启动java进程并出来。当我通过sshexec
任务从Jenkins运行shell脚本时,它会运行,但它永远不会出现,Jenkins Build会等待。
稍后当我将timeout
属性添加到sshexec
时,它会在给定的毫秒数后超时,但Jenkins构建显示为失败。如何让sshexec任务从shell脚本执行中干净利落地出来?
这是我的ssheexec
任务
<sshexec host="${deploy.host}" username="${deploy.username}" password="${deploy.password}" command=". /etc/profile; cd ${deploy.path}; sh start.sh i1" trust="true" timeout="10000" />
start.sh 文件如下:
nohup java -Xms512m -Xmx1024m -cp calculation.jar com.tes.StartCalculation $1 &
echo $! > calculation-$1-java.pid
答案 0 :(得分:1)
看来,执行ssh的作业并非完全守护进程。在许多情况下,从nohup
开始是不够的。
查看与其相关的discussion(在不同的背景下)
问题是您没有关闭文件描述符 把东西推到后台。 &amp;当你在一个时候很好 shell,但是当你想断开连接并离开时,还不够 进程运行时,您需要从shell断开连接的过程。
....修复以更正脚本。
如果有人写了一个没有正确分离的天真服务脚本 从终端,我想第一次知道那个脚本 在部署中使用 - SCM更改将启用重大更改 快速确定。
隐藏问题以启用错误代码是错误的 发布到制作 - 如果我知道的第一个,我就不会高兴 关于它是在生产系统管理员抱怨的时候。
如果这是同样的问题,您需要daemonize the script