Jenkins执行脚本后关闭启动程序解决方案(转) - 图1

    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!”
    构建完成,发现服务进程不存在。

    Jenkins执行脚本后关闭启动程序解决方案(转) - 图2

    在脚本中加入 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 掉所有的衍生进程。需要进行以下配置,才能避免此类情况发生:

    1. 重设环境变量 build_id

    在 execute shell 输入框中加入 BUILD_ID=DONTKILLME, 即可防止 jenkins 杀死启动的 tomcat 进程

    Jenkins执行脚本后关闭启动程序解决方案(转) - 图3

    1. 在启动 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 Jenkins执行脚本后关闭启动程序解决方案(转) - 图4OLD_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