更新:根据以下讨论,我编辑了我的答案以获得更准确的描述。
我正在尝试从jenkins运行nohup命令。完整的命令是
nohup java -jar /home/.../jar/server-process-0.35.jar prod >> /var/../server-process-prod.log 2>&1 &
此命令不起作用。我可以在jenkins中看到状态为成功但在linux中没有java进程。当我做&ps; ps -ef | grep java'
然而,当我删除最后一个'&' ,就是我在forground而不是background
中运行它它开始工作。我可以看到java进程已启动。
原始命令工作正常如果我在linux控制台上运行它。
我需要以原始形式从jenkins运行它作为backgorund过程。所以它与詹金斯无关。
任何线索为什么会发生这种情况?
答案 0 :(得分:0)
遇到同样的问题,补充道:
BUILD_ID=dontKillMe python /var/lib/jenkins/release.py
进入执行外壳 - >命令和内部release.py有:
os.system('nohup java -jar ' + new_jars_on_server + '/' + generated_jar_by_mvn_name + '&')
并且有效
答案 1 :(得分:0)
长话短说,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。
答案 2 :(得分:0)
我尝试了使用BUILD_ID进行所有可能的组合,但没有成功。 我通过将“ nohup命令> output.txt&”放入jenkins中的execute shell运行的shell脚本中来使其变得更困难了!
答案 3 :(得分:0)
最好的简单解决方案是使用“现在”而不是“ nohup”
在您的工作中,詹金斯(执行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
答案 4 :(得分:0)
在您的jenkins shell脚本中尝试:
apply
对我有用!
答案 5 :(得分:0)
对我有用的是将 nohup java -jar ... 命令包装到execute shell命令中的sh文件中,并在之后立即运行相同的sh文件:
echo "starting java jar..."
cd [some location where jar is]
echo "nohup java -jar [jar_name].jar &" > start-jar-in-background.sh
sh start-jar-in-background.sh
echo "started java jar"
如果我在Execute shell命令中内联了 nohup java -jar ... ,则由于某些原因它没有启动它。我花了很多时间,希望对某人有帮助';)
答案 6 :(得分:0)
最简单的方法:
`nohup java -jar [jar_name] .jar> log_file_you_want 2> another_file`&