如图,由于网络波动,有时候早上6点会出现数据库连接重置的异常,导致tomcat上的一个kbdatainterface的程序跟gg了一样,所以写了一个定时检查的脚本,每早7点检查,如果有报错就重启tomcat。
但是这个脚本我发现我手动执行就正常调用,定时任务调用它的时候,他不会执行tomcat的关闭或者启动命令,这是什么原因呢?是权限的问题吗?
#获取当前时间
current=$(date)
#检查是否有报错
if test $(cat /app/ICSR4TEST/javalog/kbdatainterface.log|tail -n 200|grep -c 'ERROR') -ne 0
then
echo "程序报错了,时间为:" $current >> /app/ICSR4TEST/aotuocheck.log
echo "程序报错了,时间为:" $current
#重启tomcat
sh /app/ICSR4TEST/tomcat7/bin/shutdown.sh
while (true)
do
#tomcat还没关闭的话就等待一下
if test $(ps -ef |grep -c 'tomcat7') -gt 1
then
echo "wait wait..."
sleep 5
#已经关闭的话就重启tomcat
else
echo "已经关闭,正在重启..." >> /app/ICSR4TEST/aotuocheck.log
sh /app/ICSR4TEST/tomcat7/bin/startup.sh
break
fi
done
#检查是否启动成功
while (true)
do
usetime=0
if test $(cat /app/ICSR4TEST/tomcat7/logs/catalina.out|tail -n 200|grep -c 'Server startup in') -eq 1
then
echo "重启成功"
break
else
sleep 220
usetime=`expr $usetime + 220`
if test $[usetime] -gt 500
then
echo "启动超时" $current
break
fi
fi
done
else
echo "现在正常" $current >> /app/ICSR4TEST//aotuocheck.log
echo "现在正常" $current
fi
下面红框里两个打印程序报错的语句,第一次是定时任务执行它打印的,第二次是我手动调用这个任务打印的。
涉及到tomcat的启停,可能与是否获取到Javahome有关系,换成这样试试,重启tomcat另写一个脚本。
autocheck.sh
#获取当前时间
current=$(date)
#检查是否有报错
if test $(cat /app/ICSR4TEST/javalog/kbdatainterface.log|tail -n 200|grep -c 'ERROR') -ne 0
then
echo "程序报错了,时间为:" $current >> /app/ICSR4TEST/aotuocheck.log
echo "程序报错了,时间为:" $current
#重启tomcat
sh /app/ICSR4TEST/tomcatStart.sh
#检查是否启动成功
while (true)
do
usetime=0
if test $(cat /app/ICSR4TEST/tomcat7/logs/catalina.out|tail -n 200|grep -c 'Server startup in') -eq 1
then
echo "重启成功"
break
else
sleep 220
usetime=`expr $usetime + 220`
if test $[usetime] -gt 500
then
echo "启动超时" $current
break
fi
fi
done
else
echo "现在正常" $current >> /app/ICSR4TEST//aotuocheck.log
echo "现在正常" $current
fi
tomcatStart.sh
#!/bin/sh
#设置环境变量
JAVA_HOME=/usr/java/jdk1.7.0_15
JRE_HOME=/usr/java/jdk1.7.0_15/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
#tomcat启动程序
startTomcat=/app/ICSR4TEST/tomcat7/bin/startup.sh
#tomcat启动脚本
TomcatID=$(ps -ef | grep tomcat | grep -w 'tomcat'|grep -v 'grep'|awk '{print $2}')
#杀掉原tomcat进程
if [[ $TomcatID -eq "" ]];
then
$startTomcat
else
kill -9 $TomcatID
sleep 15s
$startTomcat
fi
具体情况待观察,但我觉得已经是真相了。