linux shell 手动执行tomcat 和 计划任务重启tomcat 不一致。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell 手动执行tomcat 和 计划任务重启tomcat 不一致。相关的知识,希望对你有一定的参考价值。

#!/bin/bashaa=`ps -ef | grep tomcat7_1 | grep -v grep`
if [ -z "$aa" ]
then
/usr/local/tomcat7_1/bin/startup.sh
exit
fi

tomcat1pid=`ps aux | grep tomcat7_1 | grep -v grep | awk 'print $2'`
tomcat1cpuload=$(top -n 1 | grep `echo $tomcat1pid` | awk 'print $9*10')
tomcat1cpuload2=$(top -n 1 | grep `echo $tomcat1pid` | awk 'print $10*10')
if [ -n "$aa" ] && [[ $tomcat1cpuload != 0 ]] && [[ $tomcat1cpuload -lt 70 ]]then
kill -9 $tomcat1pid

sleep 5
/usr/local/tomcat7_1/bin/startup.sh
echo 'tomcat7_1 restart in '`date "+%Y-%m-%d %H:%M"` >> tomcatrestart.log
exit

elif [ -n "$aa" ] && [[ $tomcat1cpuload = 0 ]] && [[ $tomcat1cpuload2 -lt 70 ]]then
kill -9 $tomcat1pid
sleep 5
/usr/local/tomcat7_1/bin/startup.sh
echo 'tomcat7_1 restart in '`date "+%Y-%m-%d %H:%M"` >> tomcatrestart2.log
exit
fi
手动执行这个脚本,是可以判断cou负载来重启tomcat的。但是放到计划任务中,就不判断,直接执行重启tomcat。

参考技术A 你的计划任务是哪个用户执行的,再有计划任何里也要配置JAVA运行环境。
如果使用计划任务,建议使用启动tomcat的用户来执行,并且在脚本里配置上JAVA运行环境
如果不是tomcat的用户来执行这个脚本,在top,是有可能读不出tomcat的。再有,root用户也是有可能读不出的,root只能读到占资源比较高的进程的信息,建议使用tomcat的用户来执行top。这样可以更容易读到top里面关于 tomcat的信息,并作出判断 。追问

root 用户执行的... 你的意思是计划任务执行的时候,也要把java的那几个变量写进去吗

追答

建议不要用root执行。因为root的进行比较多,而且top只是读到的只是占负载前几名的进程,并不是本机内所有进程,你脚本里,在tomcat1cpuload 和tomcat1cpuload2 没有做空值判断,所以当这两个变量为空的时候,就无法判断,返回1,也会导致直接重起

===================
这样吧,你留下QQ,我来帮你实现,你脚本判断有问题。而且tomcat重起,有个shutdown.sh,并不是直接kill,直接kill,会影响正在进行中的session

$tomcat1cpuload != 0 这个判断有问题

当取不到值是,为空,而不是0 空和0是两个概念
==========不想留QQ,请按我说的做======================
单独建个tomcat专用的用户,并且用此用户执行计划任务,这样至少不会让你的tomcat为空
计划任务这样写 * * * * * 用户名 /home/tomcat/cpu_load_check.sh或者在tomcat用户下执行crontab -e直接编辑

修改判断方式,0和空要正确区分,当你用专用用户执行tomcat,这个判断就可以不用了,只判断进程是否存在就OK

脚本里加入JAVA运行环境

祝你成功

追问

632420568 谢谢

本回答被提问者采纳
参考技术B 如果懒得找问题原因,可以单独写个while循环的脚本,扔到后台执行。追问

不懂,while循环怎么找原因

追答

你这个脚本不就是检测负载然后重启吗?
你算好在crontab里的执行时间,比如1000秒检测一次。
然后用while写个死循环。加个sleep 1000秒
扔后台执行,这样每隔1000秒执行一次这个脚本。
这不也能达到你预期的效果吗?

如果crontab不执行,无非就是权限,crontab的配置,环境变量,脚本是否有问题。
如果你不着急用,就慢慢排查吧。既然你脚本没问题,那么你发的这个脚本看不看都没什么意义。

参考技术C 手动执行这个脚本是成功的,那我就不去研究你的脚本了。

但是放到计划任务中不行,那就从手工执行和计划任务两者的不同来找原因了。
两者最大的不同就是环境变量,建议在脚本中放入语言LANG,PATH,和tomcat+JDK最初安装时的环境变量申明。

快速部署Tomcat项目的Shell脚本

为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启tomcat之前先检查tomcat进程有没有停掉,没有还要手动kill该进程。

发布次数多了,操作就比较繁琐了,索性写个脚本一键发布,省时省力^_^。

把deploy.sh和restart.sh分别拷贝到3个tomcat的bin目录下,再用chmod +x给这两个脚本赋上可执行权限。

一键发布命令:./deploy.sh 项目war包    例如:./deploy.sh /home/test.war

说明:deploy.sh会先清空tomcat下的ROOT目录,再将指定的war包加压至ROOT目录,最后执行restart.sh重启tomcat。

代码如下:

 1 #!/bin/sh
 2 
 3 war=$1
 4 bin=$(cd `dirname $0`; pwd)
 5 
 6 if [ ! -n "${war}" ]; then
 7     echo "***Usage: $0 [project.war]"
 8     exit 0
 9 fi
10 if [ ! -f "${war}" ]; then
11     echo "***Error: ${war} does not exist."
12     exit 0
13 fi
14 if [ ! "${war##*.}" = "war" ]; then
15     echo "***Error: ${war} is not a war file."
16     exit 0
17 fi
18 
19 echo "Deploy ${war##*/}..."
20 rm -rf ${bin}/../webapps/ROOT/ && unzip -qo ${war} -d ${bin}/../webapps/ROOT/
21 rm -rf ${bin}/../work/Catalina/localhost/
22 echo "Restart tomcat..."
23 exec ${bin}/restart.sh

如需重启tomcat则使用命令:./restart.sh 或 ./restart.sh -v (参数-v表示启动时打印tomcat启动日志)

说明:restart.sh是用来重启tomcat的,如果tomcat没有启动则直接启动,如果已经启动就先shutdown再启动,如果shutdown之后3s没有停掉tomcat进程,则kill掉原来的进程再启动。

代码如下:

 1 #!/bin/sh
 2 
 3 bin=$(cd `dirname $0`; pwd)
 4 pid=$(ps aux | grep tomcat | grep -v grep | grep -v restart | grep ${bin} | awk ‘{print $2}‘)   5 
 6 if [ -n "${pid}" ]; then
 7     echo "Shutdown..."
 8     sh ${bin}/shutdown.sh
 9     sleep 3
10 
11     pid=$(ps aux | grep tomcat | grep -v grep | grep -v restart | grep ${bin} | awk ‘{print $2}‘) 12     if [ -n "${pid}" ]; then
13         kill -9 ${pid}
14         sleep 1
15     fi
16 fi
17 
18 echo "Startup..."
19 sh ${bin}/startup.sh
20 if [ "$1" = "-v" ]; then
21     tail -f ${bin}/../logs/catalina.out
22 fi

本人用的是CentOS,3个tomcat分别在/opt/apache-tomcat-7.0.65/下的8080/8081/8082子目录下,监听8080/8081/8082端口。运行截图如下:

技术分享图片

技术分享图片

最后在浏览器里输入 http://localhost:8080 即可访问。

以上是关于linux shell 手动执行tomcat 和 计划任务重启tomcat 不一致。的主要内容,如果未能解决你的问题,请参考以下文章

两个问题,第一:tomcat 清理日志 要重启tomcat服务吗? 第二:linux下如何手动清理日志?谢谢!

linux shell脚本Tomcat自启动脚本

linux Shell 中grep+wc取值在shell中的结果与手动执行结果不一致的坑

linux Shell 中grep+wc取值在shell中的结果与手动执行结果不一致的坑

Linux下shell脚本监控Tomcat的状态并实现自动启动

快速部署Tomcat项目的Shell脚本