无法从jenkins运行nohup命令作为后台进程

问题描述 投票:4回答:5

更新:根据以下讨论,我编辑了我的答案,以获得更准确的描述。

我正试图从詹金斯那里运行一个nohup命令。完整的命令是

nohup java -jar /home/.../jar/server-process-0.35.jar prod >> /var/../server-process-prod.log 2>&1 &

此命令不起作用。我可以在jenkins中看到状态为成功但在linux中没有java进程。当我做'ps -ef | grep java'

但是,当我删除最后一个'&'时,我就是在forground而不是background中运行它

它开始工作。我可以看到java进程已启动。

原始命令工作正常如果我在Linux控制台上运行它。

我需要以原始形式从jenkins运行它作为backgorund过程。所以它与詹金斯无关。

任何线索为什么会发生这种情况?

java linux unix jenkins nohup
5个回答
2
投票

我尝试了与BUILD_ID的所有可能的组合,但它没有用。我通过在jenkins中执行shell运行的shell脚本中放入“nohup command> output.txt&”来实现它,它工作得很好!


1
投票

简而言之,Jenkins会在作业结束后杀死所有由作业产生的进程。要覆盖此行为,您需要设置环境变量。

变量似乎因作业类型而异。它曾经是BUILD_ID,但对于管道工作,它是JENKINS_NODE_COOKIE,并且在this answer中提到了其他几个。

因此,如果您在Pipeline中运行命令,它将如下所示:

sh 'JENKINS_NODE_COOKIE=dontKillMe nohup java -jar /home/.../jar/server-process-0.35.jar prod >> /var/../server-process-prod.log 2>&1 &'

有关更多信息,请参阅the wiki on ProcessTreeKillerthis comment in the Jenkins Jira


1
投票

在你的jenkins shell脚本中尝试:

  export BUILD_ID=dontKillMe
  nohup java -jar your_java_app.jar &

它对我有用!


0
投票

得到了同样的问题,补充道:

BUILD_ID=dontKillMe python /var/lib/jenkins/release.py

进入执行Shell - >命令和内部release.py有:

os.system('nohup java -jar ' + new_jars_on_server + '/' + generated_jar_by_mvn_name + '&')

它的工作原理


0
投票

最简单的解决方案是使用“at now”而不是“nohup”

在你的工作jenkins(执行shell)放:

set +e #so "at now" will run even if java -jar fails
#Run java app in background
echo "java -jar $(ls | grep *.jar | head -n 1)" | at now + 1 min
© www.soinside.com 2019 - 2024. All rights reserved.