Linux下Tomcat定时重启

背景

最近发现Linux(CentOS 8.0)下Tomcat中的服务在连续运行一段时间后,再访问Tomcat下的项目会出现空白页。首先查看Tomcat服务器是否正常运行,发现Tomcat线程存在。接着查看Tomcat的实时日志发现当时的日志中并没有报错,但往上翻得时候会发现有OutOfMemoryError(内存异常)。既然知道原因了,那么解决办法也就出来了。

解决方案

  1. 提升服务器配置,优化JVM参数。(有一定的成本)
  2. 设置Tomcat定时重启。(无成本,但有一定的风险)

这里介绍下第二种方案

就是写一个shell脚本,每天定时重启Tomcat服务。这里主要记录一下如何写shell脚本并且配置定时任务。本人云服务器环境是阿里云Linux(CentOS 8.0),以下配置在该服务器上能正常运行。

一、创建shell脚本

在Windows下新建一个ar-tomcat.sh文件,使用Notepad++编辑以下内容

#!/bin/bash
. /etc/profile
tomcatPath="/usr/local/tomcat"
binPath="$tomcatPath/bin"
echo "[info][$(date +'%F %H:%M:%S')]正在监控tomcat,路径:$tomcatPath"
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]tomcat进程为:$pid"
echo "[info][$(date +'%F %H:%M:%S')]tomcat已经启动,准备使用shutdown命令关闭..."
$binPath"/shutdown.sh"
sleep 2
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭失败,准备kill进程..."
kill -9 $pid
echo "[info][$(date +'%F %H:%M:%S')]kill进程完毕!"
sleep 1
else
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭成功!"
fi
else
echo "[info][$(date +'%F %H:%M:%S')]tomcat未启动!"
fi
echo "[info][$(date +'%F %H:%M:%S')]准备启动tomcat..."
$binPath"/startup.sh"

脚本的逻辑比较简单,先查看tomcat进程是否存在,如果不存在则直接调用startup.sh命令启动tomcat,如果tomcat的进程存在则调用shutdown.sh命令停掉tomcat服务,有时会关闭失败,所以在检查一下tomcat进程时候还存在,如果存在就使用kill命令杀掉该进程,然后启动tomcat。
这里有一个地方需要注意,第二行代码(. /etc/profile)不能省掉,需要将环境变量引入到当前脚本环境中,要不然会导致启动定时任务时运行脚本失败,会报以下错误:

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program

二、修改文件权限

通过xftp将编辑好的ar-tomcat.sh出入Linux服务器,我放在/usr/local/tomcat下

要让脚本可以执行,当然要把文件设置为可执行文件了。

chmod 777 ar-tomcat.sh

三、建立定时任务

在控制台上输入使用crontab -e 命令进入编辑crontab脚本,有的人第一次输入该命令时需要选择编辑器

然后保存并退出即可,接着使用crontab -l命令即可看到刚才新增的定时任务在列表里面。一般情况是直接生效,如果没有生效可以使用sudo service cron restart命令重启定时任务。

四、定时任务描述语法

crontab中每一个定时任务的格式由6部分组成,分别是分钟、小时、天、月、星期以及命令,前5部分用来配置任务触发时机,中间使用空格隔开,如下:
minute hour day month dayofweek command

  • minute – 表示分钟,值的范围是从0到59的整数 
  • hour – 表示小时,值的范围是从0到23的整数 
  • day – 表示天,值的范围是从1到31的整数
  • month – 表示月,值的范围是从1到12的整数
  • dayofweek – 表示星期,值的范围是从0到6的整数 (0表示周日)
  • command – 需要执行的命令(/home/script/tomcat.sh > /home/script/shlog.txt表示执行tomcat.sh脚本,并且把结果日志打印到shlo.txt中)

 时间部分除了使用估计数字以外还可以配合星号(*),逗号(,),斜杠(/),横杠(-)组合来表示其他意义。

1. 星号(*)

表示任意值,比如:

30 01 * * * command #每天的1:30执行命令

2. 逗号(,)

表示指定的时间,比如:

30 01 1,10,20 * * command #每月的1号、10号、20号的1:30分执行命令

3. 斜杠(/)

表示每隔多长时间,比如:

* */2 * * * command #每个2小时执行一次命令

4. 横杠(-)

表示连续时间,比如:

* 1-7/1 * * * command #凌晨1点-7点之前每隔一小时执行一次命令

参考博客:http://www.luoxudong.com/?p=330

发布了20 篇原创文章 · 获赞 8 · 访问量 1841
展开阅读全文

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

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览