1

我在 Jenkins Ant 执行插件中有一个 Ant 任务,作为构建后步骤,用于在我们的一台服务器中远程运行 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
4

1 回答 1

1

看起来,ssh 执行的作业没有完全守护。在许多情况下,开始nohup是不够的。

请参阅与之相关的讨论(在不同的上下文中)

问题是当您将某些内容推送到后台时,您没有关闭文件描述符。& 当你在 shell 中时很好,但当你想断开连接并让进程继续运行时还不够,你需要进程与 shell 断开连接。

.... 修复以更正脚本。

如果有人编写了一个未正确从终端分离的幼稚服务脚本,我想知道该脚本第一次在部署中使用的时间——SCM 更改将能够快速识别重大更改。

隐藏问题以使不正确的代码能够发布到生产环境是错误的——如果我第一次知道它是在生产系统管理员抱怨时,我会不高兴。

如果这是同样的问题,你需要守护脚本

于 2013-04-20T02:26:49.770 回答