Tomcat定时重启脚本,可以在发布版本的时候避免手动运行shudown.sh和startup.sh脚本,此步骤会让发布新的项目版本步骤繁琐,下面我以CentOS-6.8为例详细描述一下操作步骤:
- 第一步:root用户下新建编写shell脚本,使用命令:vi tomcat_restart.sh 或者 touch tomcat_restart.sh创建文件。
[root@CentOS bin]# vi tomcat_restart.sh
[root@CentOS bin]# touch tomcat_restart.sh
- 第二步:将下面脚本复制粘贴到创建的tomcat_restart.sh文件中,Esc,:wq保存退出。
#!/bin/bash
process_name=java
tomcat_path=/usr/local/java/tomcat7.0/apache-tomcat-7.0.41/bin
pid=`ps -ef|grep $process_name|grep -v grep|awk '{print $2}' `
echo $pid
if [ -n "$pid" ];
then
{
echo "======tomcat is start===shutdown======"
$tomcat_path/shutdown.sh
sleep 5
$tomcat_path/shutdown.sh
sleep 15
pid=`ps -ef|grep $process_name|grep -v grep|awk '{print $2}'`
if [ -n "$pid" ];
then
{
echo "======to kill the tomcat pid $pid======"
kill -9 $pid
sleep 3
}
fi
echo "======start tomcat======"
$tomcat_path/startup.sh
}
else
{
echo "======tomcat is stop===start======"
$tomcat_path/startup.sh
}
fi
- 第三步:修改tomcat_restart.sh权限:
[root@CentOS bin]# chmod 777 tomcat_restart.sh
- 第四步:手动测试文件是否可以执行:
[root@CentOS bin]# ./ tomcat_restart.sh
- 第五步:添加Crontab定时脚本/任务计划:
[root@CentOS bin]# crontab -e
如何设定定时时间详见如下描述:
例:
0 2 * * * /usr/local/java/tomcat7.0/apache-tomcat-7.0.41/bin/tomcat_restart.sh >> /usr/local/java/tomcat7.0/apache-tomcat-7.0.41/bin/tomcat_restart.log
每天2点执行 tomcat_restart.sh 脚本并把执行日志追加到 tomcat_restart.log 文件中。
- 第六步:关闭/启动定时服务
[root@CentOS bin]# service crond stop
[root@CentOS bin]# service crond start
- 第七步:查看该任务是否在定时列表里面:
[root@CentOS bin]# crontab -l
0 2 * * * /usr/local/java/tomcat7.0/apache-tomcat-7.0.41/bin/tomcat_restart.sh >> /usr/local/java/tomcat7.0/apache-tomcat-7.0.41/bin/tomcat_restart.log
- 此时已经成功创建了定时任务。
脚本说明:
1、process_name就是我们通过 ps -ef|grep process_name能得到一个我们需要杀掉的进程,因为tomcat的启动是基于java的jdk的进程。
2、tomcat_path就是我们在服务器上tomcat的bin目录的具体路径。
错误处理:
1、sh脚本异常:-bash: ./tomcat_restart.sh: /bin/sh^M: bad interpreter: No such file or directory 这是不同系统编码格式引起的, tomcat_restart.sh是在Window系统下直接创建的.sh文件可能有不可见字符,需要修改文件的格式。
解决方法:
①直接在ssh中建立文件,录入脚本。
②设置文件编码格式:set ff=unix 或 :set fileformat=unix 保存退出 :wq
2、Tomcat 报错 java.net.connectexception:拒绝连接 解决办法,执行./shutdow.sh脚本关闭服务器,提示出现如下错误:
tomcat java.net.ConnectException: Connection refused 或者执行./shutdown.sh后,tomcat是stop但是java的jdk进程还在。
命令:ps -ef|grep java 找到所有java进程号,kill -9 进程号,把出现的进程干掉
保留: 用户名 XXX XXX 0 17:42 pts/0 00:00:00 grep --color=auto java之外。
重启:./startup.sh
原因与分析:表明原因在于端口被占用等可能性,其根本在于你shutdown的时候,执行的是shutdown.sh脚本,而如果项目此时有些数据库链接之类的,以至tomcat其实根本没有真正关闭,也是就是没有完全关闭掉,导致你再次shutdown的时候报错。
3、crontab任务不执行,手工执行文件可以。
问题描述:默认是root用户登录。
sh文件写法无异常,结果还是不执行,考虑到从根目录/切换到root用户目录~,查看环境变量文件。
[root@CentOS /]# su root
[root@CentOS /]# cd ~
[root@CentOS ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export PATH
[root@CentOS ~]#
发现export PATH下面没有定义环境变量信息,导致root用户没有环境变量信息,所以在root用户下面执行tomcat_restart.sh无效
于是在export PATH 下面添加两行,完整文件如下:
[root@CentOS ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export PATH
export CATALINA_HOME=/usr/local/java/tomcat7.0/apache-tomcat-7.0.41
export JAVA_HOME=/usr/local/java/jdk1.7.0_55
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HOME/bin:$CATALINA_HOME/bin
export CLASSPATH=./:$JAVA_HOME/lib:$JRE_HOME/lib:$CATALINA_HOME/lib
:wq 保存退出,应用文件.bash_profile的修改:
[root@CentOS ~]# source .bash_profile
再次编辑crontab任务,重启crond服务。
转载请注明出处:BestEternity亲笔。
附:
Linux下crontab命令的用法: