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。
如果使用计划任务,建议使用启动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的配置,环境变量,脚本是否有问题。
如果你不着急用,就慢慢排查吧。既然你脚本没问题,那么你发的这个脚本看不看都没什么意义。
但是放到计划任务中不行,那就从手工执行和计划任务两者的不同来找原因了。
两者最大的不同就是环境变量,建议在脚本中放入语言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 中grep+wc取值在shell中的结果与手动执行结果不一致的坑
linux Shell 中grep+wc取值在shell中的结果与手动执行结果不一致的坑