无法在Jenkins中作为后台进程运行nohup命令

11

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

我正在尝试从Jenkins运行一个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' 时。

然而,当我删除最后的 '&',也就是把它从后台运行改成前台运行时,它开始工作了。我可以看到 Java 进程已经启动。

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

我需要以原来的形式在 Jenkins 中运行它,也就是作为一个后台进程。这样它就独立于 Jenkins。

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


1
不,它不是这样的...我已经检查过了。 - Utsav Gupta
1
如果不使用 &,你说同样的话是否有效?也就是说,nohup java -jar /home/.../jar/server-process-0.35.jar prod >> /var/../server-process-prod.log 2>&1 - fedorqui
那么这与Jenkins有关,因此您需要提供更多有关如何配置它的详细信息。也许您需要转义&以便Jenkins能够正确解释它。 - fedorqui
为了回答你的问题,我添加了一个构建步骤“执行 shell”,其中我将上述命令保存为原样。 - Utsav Gupta
3
Jenkins在任务结束后会杀死所有派生的进程。你可以更改BUILD_ID环境变量以避免这种情况。请参见这里这里 - akhan
显示剩余6条评论
9个回答

9
简而言之,Jenkins在作业完成后会杀死所有由作业生成的进程。要覆盖此行为,您需要设置一个环境变量。
该变量似乎因作业类型而异。它曾经是BUILD_ID,但对于Pipeline作业,它是JENKINS_NODE_COOKIE,在这个答案中还提到了其他几个。
因此,如果您在Pipeline中运行命令,它会像这样:
sh 'JENKINS_NODE_COOKIE=dontKillMe nohup java -jar /home/.../jar/server-process-0.35.jar prod >> /var/../server-process-prod.log 2>&1 &'

了解更多信息,请查看ProcessTreeKiller WikiJenkins Jira上的此评论


  • sh 'JENKINS_NODE_COOKIE=dontKillMe nohup java -Xms10m -Xmx200m -jar /var/lib/jenkins/bladexTarget/target/blade-auth.jar &'
构建步骤“执行 shell”将构建标记为失败 已完成:失败```
- Gank

8
在你的Jenkins Shell脚本中尝试以下内容:
  export BUILD_ID=dontKillMe
  nohup java -jar your_java_app.jar &

对我有用!


尝试了相同的方法但没有起作用。 - AVN

3

我尝试了所有可能的BUILD_ID组合,但都没有成功。 然而,通过将“nohup command > output.txt&”放入由Jenkins中的执行shell运行的shell脚本中,我终于成功了,完美解决!


0
最简单的方法是:
`nohup java -jar [jar_name].jar >log_file_you_want 2>another_file`&

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

0
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

上述命令对他起作用了,感谢@walid,并在结尾处删除(+1分钟)


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
vi /etc/sudoers
在wheels行下面添加一行"jenkins ALL=(ALL) NOPASSWD: ALL",然后保存
进入bash执行命令"usermod -aG wheel jenkins"
使用nohup命令,像这样:"sudo nohup npx serve -s build -p 3007 > server.log 2>&1 &"
在应用程序路径中创建"server.log"后,给予它权限
它会正常工作

请添加代码块 - undefined

0

对我有效的方法是将nohup java -jar ...命令包装到sh文件中,然后在执行shell命令中运行同一个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"

如果我在“执行 shell 命令”中使用了“nohup java -jar ...”,但由于某些原因它没有启动。我花了相当长的时间来解决这个问题,希望能对某人有所帮助';)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接