在jenkins中启动tomcat控制台显示启动,但是实际没有启动的问题

问题描述:我在jenkins中启动另一个tomcat,控制台打印该tomcat启动成功,但是发现tomcat实际没有启动

出现原因:问题的根本在于是Jenkins使用processTreeKiller杀掉了所有子进程,而且这是Jenkins的默认行为。其实回头来看这个问题,就发现Jenkins的做法非常合理。当一次build异常结束,或被人终止时,必然需要结束所有这次build启动的子进程。下面的link提供了更多细节,以及解决方法。https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller。 jenkins的job结束后就会杀死相关进程

解决方案(百度关键字 解决 jenkins 自动杀掉进程大坑):

  1. shell脚本加BUILD_ID=dontKillMe
  2. 在pipeline中添加
    withEnv([‘JENKINS_NODE_COOKIE=dontkillme’]) {
    sh ‘/usr/local/apache-tomcat-9.0.33/bin/startup.sh’
    }
1赞

感谢精彩的分享,有好得案例,希望都可以与各位分享分享。

这个其实并不是 Jenkins 的锅,而且,通过一个非常隐晦的环境变量(JENKINS_NODE_COOKIE)来实现 Tomcat 不被 Kill 也是一个有安全隐患的操作。不管是什么定时任务类型的工具,都不应该启动一个阻塞性的脚本。startup.sh 脚本就是一个依赖于 Shell 的阻塞性脚本,正确的做法是:启动一个后台服务。关于这一点,有时间了,我也会整理出一些资料来。

1赞

启动后台服务?nohup ./startup.sh &这种??

nohup 并不是后台服务,那只是不会挂起。简单来说,就类似于 Linux 下的 service start tomcat 这种的

哦哦。这样,我等下好好看看这方面的东西 :+1:

我喜欢用 sh ./catalina.sh & 这样启动tomcat服务

可以用这个插件解决了!

1赞