问题
tomcat是一款非常实用强大的servlet container。但其停止过程一直让人困扰。由于$CATALINA_HOME/bin下的shutdown.sh必须等待所有处理线程退出才会生效,等待时间不可控,因此单靠shutdown.sh不能十分理想地关闭服务(至少在一段时间内不理想)。使得运维人员不得不频繁kill ps查看,造成重复操作。
我参考了startup.sh和shutdown.sh的写法,封装了下catalina.sh。
解决思路
简单谈谈解决思路,主要实现集中在关闭服务功能。shutdown_Tomcat函数首先调用catalina自带的shutdown.sh关闭服务,若返回失败,依次调用kill_Tomcat和Force_Tomcat函数。这两个函数内循环kill5次,每次间隔5s并检测存活与否,若是则返回0码。start_Tomcat先检测了当前tomcat实例,避免重复启动。
调用方法
- cd $CATALINA_HOME/bin && sh tomcat_control.sh start
- #cd $CATALINA_HOME/bin 不可省略
限制
- 设定的是通过当前pwd来定位tomcat进程,因此一个启停脚本对应一个tomcat实例,且须放置在$CATALINA/bin下,也就是和catalina.sh同目录;
- 使用tomcat_control.sh时,要先cd到$CATALINA_HOME下
技术点
- heredoc实现多行注释;
- set -u 防止使用未赋值的变量;set -o pipefail 检测并返回管道内部错误,而非默认的管道最后一个命令返回值
- 判断进程是否存在的几个方法:kill -0 $pid 或 cat /proc/$pid/cmdline,不推荐用ps aux|grep $pid的做法
- 远程调用bugfix:ssh user@host "cd $CATALINA_HOME/bin && sh tomcat_control.sh start"时,ps会额外返回记录:"bash -c cd $CATALINA_HOME/bin && sh tomcat_control.sh start",脚本内额外grep -v "$0"做了处理
环境
apache-tomcat-5.5.36
linux 2.6.9
实现
在生产环境中实测通过,小概率存在函数级联调用执行间隙,$pid已被kill而又被下一级函数复杀的问题,忽略即可。
阅读(2653) | 评论(0) | 转发(0) |