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

llmtgqce  于 2023-01-16  发布在  Linux
关注(0)|答案(8)|浏览(410)

更新:基于下面的讨论,我已经编辑了我的答案更准确的描述。
我正在尝试从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。
有线索说明为什么会这样吗?

jecbmhm3

jecbmhm31#

简而言之,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 &'

有关更多信息,请参见Jenkins Jira中的the wiki on ProcessTreeKiller和此注解。

krugob8w

krugob8w2#

在jenkins shell脚本中尝试:

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

对我有效!

kg7wmglp

kg7wmglp3#

我尝试了BUILD_ID的所有可能的组合,但都不起作用,我把“nohup命令〉output.txt&”放在jenkins的execute shell运行的shell脚本中,它完美地工作了!

gpfsuwkq

gpfsuwkq4#

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

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

进入执行Shell -〉命令,在www.example.com中release.py有:

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

而且很有效

k5hmc34c

k5hmc34c5#

最简单的解决方案是使用“at now”而不是“nohup”
jenkins(execute 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
e3bfsja2

e3bfsja26#

对我有效的是将 *nohup java -jar... * 命令 Package 到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"

如果我有 *nohup java -jar... * 内联执行 shell 命令,那么它没有启动它从一些原因。我花了相当多的时间在这方面,希望它能帮助别人';)

tcbh2hod

tcbh2hod7#

最简单的方法:
'nohup java -jar [jar_name].jar〉您想要的日志文件2〉另一个文件'&

vx6bjr1n

vx6bjr1n8#

Hi ALL,
    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
  above command worked for him, thanks @walid, & remove at the end (+ 1 min)

相关问题