Jenkins——应用篇——如何解决execute shell中启动的进程被在Job退出时被杀死问题

本文探讨了在Jenkins的executeshell或windowsbatch中启动Tomcat等web应用,使其在job结束后仍能持续运行的方法。介绍了通过调整Jenkins启动参数或修改环境变量BUILD_ID的两种策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在部落内部时不时的会有同学问一为什么在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
       BUILD_ID=DONTKILLME  //"DONTKILLME"只是为了可读性才写的,可以用任何你想用的内容代替
       startup.sh                          //根据实际情况修改启动命令的路径
       BUILD_ID=$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://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller

转载链接:https://blog.youkuaiyun.com/zxy1234x/article/details/78958376

<think>我们正在处理用户关于Jenkins问题。用户询问:“jenkins项目启动脚本 executeshell内容存储路径”。我们需要根据提供的引用和Jenkins知识来回答。回顾引用内容:引用[1]提到:在Jenkins配置中,构建部分有“Executeshell”执行shell脚本。引用[2]展示了一个Jenkins项目的配置脚本,其中包含在“Executeshell”中执行的命令。引用[3]则展示了一个部署脚本deploy.sh,但同也提到了在Jenkins任务中配置项目路径(即通过pwd获得),并在“Execute shell”中执行了多个命令(如mvnclean install,调用killTomcat函数等)。根据Jenkins的工作原理,每个项目(Job)的配置都是独立存储的。具体到“Executeshell”中的脚本内容,它存储在Jenkins主目录下的对应项目配置目录中。Jenkins的主目录(通常为~/.jenkins或/var/lib/jenkins等)中,每个项目都会有一个独立的目录,目录名与项目名一致(或使用项目编号)。在项目目录中,配置文件为config.xml。因此,我们可以推断: “Execute shell”中输入的脚本内容,实际上是存储在Jenkins主目录下的对应项目目录的config.xml文件中。具体路径格式为:$JENKINS_HOME/jobs/$JOB_NAME/config.xml其中:- $JENKINS_HOME:Jenkins的主目录,可以在Jenkins的“系统管理”->“系统设置”中查看(或者通过系统环境变量查看)。 -$JOB_NAME:项目的名称。在config.xml文件中,我们可以找到与构建相关的配置,包括“Execute shell”中的命令。通常,这些命令位于<command>标签内(对于自由风格项目)或者相应的构建步骤配置中。例如,在自由风格项目中,如果配置了“Execute shell”,那么在config.xml中会有类似如下片段: ```xml<builders><hudson.tasks.Shell><command>echo "Hello,World!"</command></hudson.tasks.Shell> </builders> ```因此,用户可以通过直接查看该项目的config.xml文件来找到“Executeshell”中的脚本内容。另外,用户也可以通过Jenkins的Web界面查看和编辑,位置在:项目->配置->构建 ->增加构建步骤-> Executeshell。但用户询问的是存储路径,所以我们应提供文件路径。注意:直接修改config.xml文件可能会导致问题,因为Jenkins在运行可能会覆盖它。通常建议通过Web界面修改。总结回答:Jenkins项目中“Executeshell”的脚本内容存储在Jenkins主目录下对应项目目录的config.xml文件中。路径示例: [Jenkins主目录]/jobs/[项目名称]/config.xml如何找到Jenkins主目录?1.登录JenkinsWeb界面,进入“系统管理”-> “系统设置”,在页面上方会显示“Jenkins主目录”。2.或者,在Jenkins服务器上,查看环境变量JENKINS_HOME(例如:echo$JENKINS_HOME)。相关问题:1.如何修改Jenkins项目的配置?2.Jenkins的config.xml文件结构是怎样的?3.如何在不重启Jenkins的情况下重新加载配置?</think>### Jenkins项目启动脚本Execute shell内容存储路径 Jenkins项目中"Execute shell"构建步骤的脚本内容存储在Jenkins主目录下的项目配置文件中,具体路径为: `$JENKINS_HOME/jobs/$JOB_NAME/config.xml` 其中: - `$JENKINS_HOME` 是Jenkins的主目录(默认位置通常是`~/.jenkins`或`/var/lib/jenkins`) - `$JOB_NAME` 是您的Jenkins项目名称 在`config.xml`文件中,Execute shell脚本内容位于以下路径的XML节点中: ```xml <project> <builders> <hudson.tasks.Shell> <command>您的shell脚本内容</command> </hudson.tasks.Shell> </builders> </project> ``` 例如,如果您的Jenkins主目录是`/var/lib/jenkins`,项目名为`deploy-project`,则完整路径为: `/var/lib/jenkins/jobs/deploy-project/config.xml` ### 查看方法 1. **通过Jenkins UI查看**: - 项目主页 → 左侧菜单"配置" → "构建"部分 → "Execute shell"输入框 2. **直接访问服务器文件**: ```bash # 查找Jenkins主目录 grep JENKINS_HOME /etc/sysconfig/jenkins # 查看具体项目的配置(示例) cat /var/lib/jenkins/jobs/your_project_name/config.xml | grep -A10 '<command>' ``` 3. **通过Jenkins脚本控制台**(管理权限): ```groovy println(Jenkins.instance.getItemByFullName("your_project_name").configFile.asString()) ``` ### 注意事项 - 直接修改`config.xml`需重启Jenkins生效(或通过`reload-configuration`端点) - 脚本中的敏感信息建议使用Jenkins凭据管理[^3] - 复杂脚本推荐外部化到单独的`.sh`文件(如引用示例中的`deploy.sh`)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值