start.sh 这个脚本为 zt-erp-schesule 的启动脚本
脚本为
#!/bin/bash
echo “start server…”
_servername=zt-erp-schedule.jar
_cd /home/project/erp/zt-erp-schedule/_
nohup java -jar $_servername —spring.profiles.active=test &
echo “success!”
构建完成,发现服务进程不存在。
在脚本中加入 BUILD_ID=dontKillMe 就好了
#!/bin/bash
BUILD_ID=dontKillMe
echo “start server…”
_servername=zt-erp-schedule.jar
cd /home/project/erp/zt-erp-schedule/
nohup java -jar $_servername —spring.profiles.active=test &
echo “success!”
解释原因引用https://blog.csdn.net/u011138533/article/details/53941123
在 jenkins 中配置自动更新部署项目时,如果采取用 execute shell 启动 / 关闭 tomcat,会发现可以进行关闭 tomcat,但是无法启动 tomcat,虽然构建会显示执行成功,但是查看进程,tomcat 是没有启动的。这是因为 Jenkins 默认会在 Build 结束后 Kill 掉所有的衍生进程。需要进行以下配置,才能避免此类情况发生:
- 重设环境变量 build_id
在 execute shell 输入框中加入 BUILD_ID=DONTKILLME, 即可防止 jenkins 杀死启动的 tomcat 进程
- 在启动 jenkins 的时候禁止 jenkins 杀死衍生进程
修改 / etc/sysconfig/jenkins 配置,在 JENKINS_JAVA_OPTIONS 中加入 - Dhudson.util.ProcessTree.disable=true。需要重启 jenkins 生效
此方法配置一次后,所有的 job 都无需设置 BUILD_ID,就能够防止 jenkins 杀死启动的 tomcat 进程
举例:
BUILD_ID=DONTKILLME
ps -ef |grep tomcat8 |awk ‘{print $2}’|xargs kill -9
cd /opt/tomcat8/bin
sh ./shutdown.sh
sleep 40s
cd /opt/var/kms_conf/
sh ./tinykms.sh
cd /opt/tomcat8/bin
sh ./startup.sh
在部落内部时不时的会有同学问一为什么在 execute shell 中不能启动 tomcat、为什么在 windows batch 中不能启动 tomcat 等问题,其实大部分情况下不是不能启动,而是启动后随着 job 结束进程被杀死,造成不能启动的假象,这一点从 tomcat 的日志中可以看来,虽然也给出了解决方法,但没有回答本质问题,利用周末和晚上的时间对这个问题进行探究,并总结下来供大家参考。
Jenkins 为了有效的杀死 job 运行时创建的子进程,提供了一些原生代码找到并杀死它们,这样做非常合理,当一个 job 结束时势必要杀死运行期间启动的进程,否则系统里会留下很多僵尸进程。尽管 Jenkins 声称这个功能在各种环境下做了测试,但为了应付在特殊环境下出现的特殊情况,Jenkins 提供了禁用此特性的方法。
Jenkins 的做法虽然非常合理,但也造成了一些问题,如我们希望在 execute shell 或 windows batch 中启动的 web 应用在 job 结束后继续运行,可以通过两种方法达到这个目录,下面分介绍。
方法一:通过 Jenkins 提供的启动参数禁用杀死子进程的特性
Jenkins 提供了 hudson.util.ProcessTree.disable 和 hudson.util.ProcessTreeKiller.disable 两个属性来控制些特性,值为 true 将禁用此特性。hudson.util.ProcessTree.disable 从 Jenkins 1.260 开始使用,而使用 1.315 之前的 Hudson 时只能使用 hudson.util.ProcessTreeKiller.disable,为了版本兼容,在 Jenkins 1.260 后这两个属性都可能使用,建议使用 1.260 之的 Jenkins 用户使用 hudson.util.ProcessTree.disable 属性。
这种方式需要在 Jenkins 启动前进行设置,以下根据笔者的经验列举各种使用情况下如何设置,如有疏漏欢迎补充、指正。
- 使用 java -jar 启动,-Dhudson.util.ProcessTree.disable=true -jar jenkins.war
- 使用 Tomcat 启动,Linux 系统修改 catalina.sh,在环境变量的说明后,脚本开始前加上 JAVA_OPTS=”$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true”;Windows 系统修改 catalina.bat,在环境变量的说明后,脚本开始前加上 set JAVA_OPTS=%JAVA_OPTS% “-Dhudson.util.ProcessTree.disable=true”;修改好 Tomcat 的配置文件后重新启动 Tomcat
在大部分情况下彻底禁用此特性可能不是我们期望的结果,这种方法不建议在工作中使用,建议的方法请参考 “方法二”
方法二:修改 Jenkins 的环境变量 BUILD_ID,这样 Jenkins 将不认为你启动的后台进程是由 job 创建的
在 execute shell 或 windows batch 输入框的中执行期望 job 结束后继续运行的命令前加上如下代码(以启动 tomcat 为例):
Linux:
OLD_BUILD_ID=$BUILD_ID
echo OLD_BUILD_ID
echo $BUILD_ID
Windows
OLD_BUILD_ID=%BUILD_ID%
echo %OLD_BUILD_ID%
BUILD_ID=DONTKILLME
startup.bat // 根据实际情况修改启动命令的路径
BUILD_ID=%OLD_BUILD_ID%
echo %BUILD_ID%
https://www.cnblogs.com/liu-sy/p/13389851.html