前提nohup命令在命令行正常执行,仅限Jenkins执行脚本中nohup命令或SCM中执行错误或直接退出
1.问题
通过jenkins执行shell脚本时,脚本中是通过nohup java -jar &的方式启动,显示执行成功,但是服务却没启动,脚本如下:
nohup /usr/src/java/bin/java -Xms512m -Xmx512m -jar /opt/application/apps/finance-business-product-web-1.0.1.jar --spring.profiles.active=uat >/opt/application/logs/product-web.log 2>&1 &
也就是说当通过Jenkins构建完后推送到业务服务器,在执行脚本时,脚本中的 nohup 命令无法正常退出,构建前台任务就卡住了,或者是nohup总是无效直接退出了。
2.排查
1.在命令行执行nohup命令,命令正常执行
2.Jenkins调用脚本执行非nohup命令,脚本执行正常
排查结论:jenkins执行非nohup命令,脚本执行正常,执行带有nohup脚本的时候出现了问题。也就是说构建命令中如果带有 nohup xxx &
触发构建后并构建成功后,虽然但在构建任务的输出中却显示没有问题,也没有任何报错,但是并没有执行shell脚本。
3.原因
jenkins默认会在构建完成后,杀掉构建过程中由shell命令触发的衍生进程。
jenkins根据BUILD_ID识别某个进程是否为构建过程的衍生进程,故修改BUILD_ID后,jenkins就无法识别是否为衍生进程,则此进程能在后台保留运行。
结论就是Jenkins程序只负责运行伪命令行nuhup 命令,并不保证是否成功运行 nuhup后面的命令。
4.解决
1.使用 BUILD_ID=xxx
,其中xxx可以是任意内容(只要不是原来的BUILD_ID内容即可)
#! /bin/bash
BUILD_ID=dontKillMe
nohup /usr/src/java/bin/java -Xms512m -Xmx512m -jar /opt/application/apps/finance-business-product-web-1.0.1.jar --spring.profiles.active=uat >/opt/application/logs/product-web.log 2>&1 &
2.修改Jenkins启动参数
在JENKINS JAVA_OPTIONS中加入-Dhudson.util.ProcessTree.disable=true。需要重启jenkins生效
此方法配置一次后,所有的job都无需设置BUILD_ID,就能够防止jenkins杀死启动的tomcat进程
3.使用at now代替nohup命令(需要atd服务运行)
#! /bin/bash
set +e #执行的时候如果出现了返回值为非零将会继续执行下面的脚本
echo "/usr/src/java/bin/java -Xms512m -Xmx512m -jar /opt/application/apps/finance-business-product-web-1.0.1.jar --spring.profiles.active=uat >/opt/application/logs/product-web.log" | at now
5.pipeline解决方法
在 Jenkins Pipeline 中,请使用JENKINS_NODE_COOKIE而不是BUILD_ID。
官方文档:https://www.jenkins.io/doc/book/managing/spawning-processes/#workarounds
抄自于:https://www.cnblogs.com/whm-blog/p/16779474.html