我正在尝试创建一个Jenkins作业,该作业将重新启动一个一直在我们的服务器上运行的程序。
我指定以下内容作为要运行的命令:
cd /usr/local/tool && ./tool stop && ./tool start
脚本"工具"包含一行类似于:
nohup java NameOfClass &
它的输出最终在我的构建控制台中,而不是在nohup.out中,所以作业永远不会终止,除非我手动终止它,这会终止程序。
如何使nohup的行为与在终端上的行为相同?
如果我正确理解了这个问题,Jenkins将在构建结束时杀死所有进程,您希望在构建完成后让一些进程继续运行。
你应该阅读https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller
本质上,Jenkins在BUILD_ID环境变量中搜索具有某些秘密值的进程。只需为您希望独处的进程覆盖它。
在新的Pipeline作业中,设置BUILD_ID
不再阻止Jenkins在作业完成后终止您的进程。相反,您需要设置JENKINS_NODE_COOKIE
:
sh 'JENKINS_NODE_COOKIE=dontKillMe nohup java NameOfClass &'
有关更多信息,请参阅ProcessTreeKiller上的wiki和Jenkins Jira中的此评论。
尝试在Jenkins构建步骤中添加&
,并使用> nohup.out
重定向输出。
我在运行jenkins的shell脚本作为后台进程时也遇到了类似的问题。我使用以下命令修复了它:
BUILD_ID=dontKillMe nohup/start-fitnesse.sh&
在您的情况下,BUILD_ID=dontKillMe nohup java NameOfClass