更新:根据以下讨论,我编辑了我的答案,以获得更准确的描述。
我正试图从詹金斯那里运行一个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过程。所以它与詹金斯无关。
任何线索为什么会发生这种情况?
我尝试了与BUILD_ID的所有可能的组合,但它没有用。我通过在jenkins中执行shell运行的shell脚本中放入“nohup command> output.txt&”来实现它,它工作得很好!
简而言之,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 ProcessTreeKiller和this comment in the Jenkins Jira。
在你的jenkins shell脚本中尝试:
export BUILD_ID=dontKillMe
nohup java -jar your_java_app.jar &
它对我有用!
得到了同样的问题,补充道:
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 + '&')
它的工作原理
最简单的解决方案是使用“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