昨天在公司使用jenkins发布项目,没有成功,今天上午来了,试了一上午,不行。下午专门部署调试这个jenkins项目,公司jenkins在A机器上,项目部署在B机器,部署过程如下:

  • A机器 从gitlab下载最新代码
  • A机器 使用maven打包项目,在target目录产生.war包*
  • A机器 通过ssh将war包传输到B机器,并执行B的restart.sh脚本
  • B机器脚本功能:将war包放到tomcat的webapps目录中,重启tomcat

#问题描述
这是我的B机器restart.sh脚本

#!/bin/bash
tomcat_home=/usr/local/system/apache-tomcat-8.0.52
jenkins_package=/usr/local/jenkins
SHUTDOWN=$tomcat_home/bin/shutdown.sh
STARTTOMCAT=$tomcat_home/bin/startup.sh
echo "关闭$tomcat_home"
$SHUTDOWN
ps -ef |grep tomcat |grep $tomcat_home |grep -v 'grep'|awk '{print $2}' | xargs kill -9

#删除webapp文件夹
rm $tomcat_home/webapps/* -rf
#删除日志文件,如果你不先删除可以不要下面一行
rm  $tomcat_home/logs/* -rf
#删除tomcat的临时目录
rm  $tomcat_home/work/* -rf
#删除cataline文件
rm -rf $tomcat_home/logs/catalina*
#拷贝打好的war包到tomcat
cp -f $jenkins_package/system.war $tomcat_home/webapps/system.war

echo "启动$tomcat_home"
$STARTTOMCAT
#sleep 5	#!加上这个,小伙!
#看启动日志
#tail -f $tomcat_home/logs/catalina.out

  我在jenkins启动的时候,观察启动过程,发现最后一步没有启动tomcat。查看catalina.out文件,最后输出一句:
org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
  不难看出shutdown、stopping字眼。
  tomcat自动停止了!!!
  经过一番网上冲浪,原因在远程执行脚本的问题上,A机器执行B机器的重启tomcat脚本的时候,脚本执行完,但是启动tomcat这个任务还未来的及进行,就在这个时候ssh远程连接关闭,脚本退出的时候,发给他的子进程(启动tomcat进程)信号,tomcat因为还没开始启动,就停止了!!!
  如果在启动tomcat命令执行后,延迟5秒退出,只要tomcat开始启动就不会因为脚本退出而关闭了!
  于是**在$STARTTOMCAT下面加入一行 sleep 5 **就行了!

#参考
http://hongjiang.info/why-kill-2-cannot-stop-tomcat/

结语

推荐下我的开源作品 PiperChat
PiperChat 是一款简洁高效的即时通讯服务,提供多种技术供开发者选择,帮助开发者快速构建高并发的即时通讯服务。
帮助企业快速接入 IM系统 / 聊天室系统 / 客服系统 等其他实时消息类系统,如果对你有用请求给我一个Star呀!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐