我在Tomcat服务器上运行一个Web应用程序。 服务器代码中有一个很难察觉的问题,导致它每天崩溃一次或两次。 有空的时候,我会尽力纠正。 但直到那一天,在一个有问题的情况下,重新启动tomcat(/etc/init.d/tomcat7 restart)或基本上重新启动机器也是现在看来相当不错的解决scheme。 我想用wget而不是grep或其他东西来检测服务器的活力,因为即使tomcat正在运行我的服务,
wget localhost:8080/MyService/
输出
--2012-12-04 14:10:20-- http://localhost:8080/MyService/ Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:8080... connected. HTTP request sent, awaiting response... 200 OK Length: 2777 (2.7K) [text/html] Saving to: “index.html.3” 100%[======================================>] 2,777 --.-K/s in 0s 2012-12-04 14:10:20 (223 MB/s) - “index.html.3” saved [2777/2777]
当我的服务到了。 和输出
Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:8080... failed: Connection refused.
或者在说完之后
--2012-12-04 14:07:34-- http://localhost:8080/MyService/ Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:8080... connected. HTTP request sent, awaiting response...
你可以给我一个cron作业的shell脚本或其他东西来做到这一点。 如果有替代scheme,我宁愿不使用cron。
而不是从头开始编写脚本,我强烈build议使用Monit 。 我发现这个页面给了你一些基础知识,但是我发现这里的实现有点草率。 所以,让我解决这个问题。 这将解释如何在Ubuntu 12.04中设置monit 。 首先,从库中安装monit ,如下所示:
sudo aptitude install monit
接下来,您要调整邮件服务器设置,以便可以收到电子邮件警报。 只要打开这样的monitconfiguration:
sudo nano /etc/monit/monitrc
现在使用邮件服务器设置来查找该区域,并插入以下行:
set mailserver localhost
这是我用于Apache的规则集。 首先,创buildconfiguration文件:
sudo nano /etc/monit/conf.d/apache2.conf check process apache with pidfile /var/run/apache2.pid start "/etc/init.d/apache2 start" stop "/etc/init.d/apache2 stop" if failed host 127.0.0.1 port 80 with timeout 15 seconds then restart if loadavg (1min) greater than 7 for 5 cycles then restart alert [email protected] only on { timeout, nonexist, resource }
然后像这样重新启动monit :
sudo service monit restart
该规则集检查127.0.0.1的本地主机地址上的端口80 ,如果有15秒的超时,则重新启动Apache服务。 我也有一个连接到它的负载平均规则,每分钟检查一次负载,如果连续5个周期高于7,它将重新启动apache服务。
对于Tomcat来说,调整这个页面上的规则 – 如上所述 – 看起来像这样。 首先在monit config目录中打开一个文件进行编辑,如下所示:
/etc/monit.d/tomcat
把这个规则集放在里面:
check host tomcat with address localhost stop program = "/etc/init.d/tomcat stop" start program = "/etc/init.d/tomcat restart" if failed port 8080 and protocol http then start alert [email protected] only on { start, nonexist }
然后像这样重新启动monit来执行这些新规则:
sudo service monit restart
我会仔细检查{ start, nonexist }因为我现在只是猜测,因为我没有Tomcat设置来testing。 但是这应该是好的。
你可以在这里关注monit日志:
sudo tail -f -n 200 /var/log/monit.log
我希望你已经find了你的问题的根本原因,并能够妥善解决它。 如果您或其他人需要解决scheme,这是一个答案的尝试。
这里的事情是你的服务可能有时会“挂起”,监控也必须能够追上来。 在下面的简单脚本中,我们将wget状态查询置于后台,等待几秒钟,如果它无法从服务中检索状态200,则重新启动它。
#!/bin/sh # WARNING, UNTESTED CODE ! TMPFILE=`mktemp` WAITTIME=15 # Run the test wget localhost:8080/MyService/ -o $TMPFILE & WGETPID=$! # Wait few seconds and let the test finish sleep $WAITTIME if [ ! `grep "HTTP request sent" $TMPFILE |grep "200 OK"|wc -l` -gt 0 ]; then echo "The service did not return 200 in $WAITTIME seconds." echo "Restarting it." /etc/init.d/tomcat7 restart fi # Cleanup rm $TMPFILE kill $WGETPID
对于调度,我真的推荐cron为了简单。 另一种select是将其作为守护进程启动,这将引入不必要的复杂性,恕我直言。 还有一些其他(外部)调度程序可以使用,但我保持最简单的cron。
希望这有助于。
Monit是一个很好的工具。 它将监视像Tomcat (或硬盘空间等)的服务或服务器状态,它会重新启动它们,根据你放在configuration文件中发送给你一个电子邮件等,比Bash脚本更强大和更灵活(你可以更喜欢简单)。