Jenkins通过shell不能启动Tomcat和启动后进程被杀死的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012475575/article/details/82907617

        工作中搭建基于Jenkins+Svn+Maven+Tomcat的持续集成环境,结合shell实现自动编译部署和测试,其中Jenkins是通过Tomcat启动的。

        问题一、Tomcat无法启动

        在搭建过程中出现一个现象,自动编译,停止项目Tomcat,war包复制等都没有问题,但是项目Tomcat停止后,无法启动。把脚本放在服务器直接执行,tomcat可以正常启动,通过Jenkins执行就不行。

        脚本如下:

#!/bin/bash
export BUILD_ID=192.168.5.258 #必须加  
TOMCATTHREAD=`ps aux | grep 'tomcat-ceshi' | grep -v grep`  
if test -z "$TOMCATTHREAD"  
then  
   echo "TOMCAT NOT START"  
else  
    THREADLIST=(${TOMCATTHREAD// / })
    PID=${THREADLIST[1]}  
    kill -9 $PID 
    sleep 6s  
fi  
   cd /usr/local/tomcat-ceshi/webapps  
   rm -f test.war
   rm -rf test 
   cp -r /usr/local/tomcat-forjenkins18/workspace/test/test-web/target/test.war  /usr/local/tomcat-ceshi/webapps/
   cd /usr/local/tomcat-ceshi/bin  
   ./startup.sh 
   sleep 5s

        观察Jenkins自身Tomcat的日志,发现有报错:端口被占用,Jenkins的Tomcat又被启动了一次,结合Jenkins控制台输出

感觉脚本中./startup.sh 启动的不是项目Tomcat,而是Jenkins自身Tomcat,于是修改项目Tomcat的catalina.sh, 重新设置了Tomcat启动需要的变量,如下

JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=1024m -XX:MaxNewSize=1024m"
export TOMCAT_HOME=/usr/local/tomcat-ceshi
export CATALINA_HOME=/usr/local/tomcat-ceshi
export JAVA_HOME=/usr/local/java/jdk1.8.0_101

         构建项目,项目Tomcat启动成功。此时,Jenkins控制台输出的环境变量也变成了项目Tomcat路径,不再是JenkinsTomcat路径。

        原因分析(个人理解):项目Tomcat未启动应该环境变量的问题,脚本./startup.sh启动了一个tomcat, 但启动的是Jekins本身的TOMCAT , 不是Cd到目录下的目标TOMCAT,正常在服务器cd到对应目录, 此时环境变更(CATALINA_BASE、CATALINA_HOME、CATALINA_TMPDIR、JRE_HOME、CLASSPATH)没值,./startup.sh默认使用录前目录Tomcat路径,故可正常启动当前目录下的TOMCAT:而在Jenkins的脚本中,Jenkins是用TOMCAT启的, 启动的时候设置了环境变量,  要启动的目标TOMCAT是通过Jenkins启动的, 延用了Jenkins的环境变量,其Startup.sh (其实是 CATALINA.sh)运行时上述几个环境变量还是Jenkins的值,故再一次启动了Jenkins的TOMCAT,而不是目标TOMCAT。

        问题二、Tomcat启动后又被杀死

        因为上述使用的脚本中有export BUILD_ID=192.168.5.258 ,所以并未遇到Tomcat启动后又被杀死的问题,总结网上各类文章,Tomcat服务启动后被停止的原因是由于jenkins构建完毕后杀掉了所有其启动的进程,但是我们需要启动的Tomcat服务继续运行,可通过重置环境变量BUILD_ID和禁用Jenkins杀死子进程特性来实现,Jenkins上的说明

        (Jenkins若是通过Tomcat启动的,禁用特性的话,修改其Tomcat的catalina.sh,脚本前加JAVA_OPTS="$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true")

 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页