Linux下重启tomcat

最近在学习shell编程,以完成一些基础操作,任务驱动学习,这样适用,故边学边试着用一下,来写一个tomcat重启shell脚本,其实其他的没有restart都差不多吧。

一、在自己的用户的一个目录下新建两个.sh文件

tomcat_shutdown.sh:
#!/bin/sh
`/home/wz/dev/server/tomcat/apache-tomcat-6.0.41/bin/shutdown.sh`

tomcat_start.sh:
#!/bin/sh
`/home/wz/dev/server/tomcat/apache-tomcat-6.0.41/bin/startup.sh`

chmod +x tomcat_shutdown.sh
chmod +x tomcat_start.sh


二、在linux系统终端中,输入命令“crontab -e”,会自动进入到一个vi编辑环境中,在里面输入自己的任务:

01 04 * * * /home/wz/dev/testshell/tomcat_shutdown.sh#即上述新建的第一个文件,用绝对路径
03 04 * * * /home/wz/dev/testshell/tomcat_start#即上述新建的第二个文件,用绝对路径
保存退出会显示:
crontab: installing new crontab
可以用crontab -l来查看当前用户的任务
解释一下:
01 04 * * *这样的表达式,这是Linux下的cron表达式,从前往后是分、时、日、月、星期,不太清楚是否支持星期和日同时指定的情况。
*表示所有,其表达中可的符号还有“?”、“/”、“-”、“,”,具体请自己去查看资料(那个quartz的任务调度就是用这个方式实现的),

比如01 04 * * *就表示在每天的凌晨4点1分调度这个任务,Linux是每分钟都去检查用户是否用定时任务的。

三、然后就可以测试了,把系统时间改到任务调度前一分钟什么的

date -s "2015-06-16 04:00:00.466"
过几分钟
ps -ef|grep tomcat
一下,发现tomcat是启动了,看看日志什么的都正常啦,
你可以用:
tail -f /var/spool/mail/username看看任务调度情况
再改为下一天的那个时候试试
date -s "2015-06-17 04:00:00.466"
同样的过几分钟去ps一下,发现tomcat的进程多了,为什么呢?

因为在上面重启的过程是没有kill掉以前的进程的。所以我觉得这得改进……(这是shell脚本里处理的问题,后续再说吧)

四、清除定时任务

使用命令:crontab -r即可清除当前用户的定时任务

五、针对第三点中提及的改进问题

步骤是这样的:
1)停止已将要重启的并处于启动状态的tomcat
2)查找到这个tomcat停止了但是没有终止的进程
3)kill掉这个tomcat的那些为终止的进程
4)start it

先直接看shell脚本吧,测了木有发现有问题。几点说明写在后面好了
tomcat_restart.sh:


#!/bin/bash

#define the basedir must change to yours
basedir="/home/wz/dev/server/tomcat/apache-tomcat-6.0.41/"

#give it 5s to shutdown the tomcat
${basedir}bin/shutdown.sh
sleep 5

# get the process descript one or many  times
fullstring=`ps -ef|grep -n ${basedir}bin/bootstrap.jar|grep -v grep`
while [ ${#fullstring} != 0 ]
do
	arr=($fullstring)
	echo "tomcatPID = ${arr[1]}"
	echo "be about to kill ${arr[1]}------------------------------------------"
	kill -9 ${arr[1]}
	fullstring=`ps -ef|grep -n ${basedir}bin/bootstrap.jar|grep -v grep`
done

#remove tomcat cache
rm -rf ${basedir}/work

#start tomcat
nohup ${basedir}bin/startup.sh &


作几点说明:

1.获取进程ID的方式
网友dangbinghoo早就在其博文
这里
中描述了三种方式:
 ps -A |grep "cmdname"| awk '{print $1}'
 pidof "cmdname"
 pgrep "cmdname"
这三种在bash和busybox ash里面的运行结果稍有不同,
第一种完全相同,但是因为调用命令次数较多,性能上是不行的。
第二种: pidof 只能获取程序的文件名匹配到的进程号,在ash中 比如 pidof "usr/bin/telnetd" 和 pidof "telnetd"中结果不一样, 前一种结果为空,但是在bash中执行两者一样。
第三种: pgrep跟1的效果相同,因为是单一命令,比第一种性能要好得多。
所以nanoRC就改进为pgrep

但是我刚开始学习shell编程基础,还不太熟悉,用了一下,感觉不太好使,就寻思着使用“ps”加上刚学的一些基本的运算和判断来处理,但是同样感谢dangbinghoo为我们提供了三种简洁方式!

2.前面有说用cronolog来分割tomcat的日志,所以tomcat启动时同时去启动了那日志输出的进程,并且这个进程随着它的启动者的kill而kill掉,所以采取循环动态获取的方式,再说也不可能启着很多tomcat的进程而未终止(除非操作有问题)。

3.while的判断本来试着用[ $fullstring ]或者[ -z $fullstring ]的,感觉木有问题,但是一直参数多的错误,所以用目前的方式来判断,如果怕其他情况引起死循环,可以取其 ${arr[1]}再判一次,为空就break。


你可能感兴趣的:(开发软件配置)