我在 Tomcat 服务器上运行 Web 应用程序。服务器代码中有一个难以检测的问题,导致它每天崩溃一两次。我会在有时间的时候深入研究并纠正它。但在那一天之前,在出现问题的情况下重新启动 tomcat(/etc/init.d/tomcat7 restart)或基本上重新启动机器目前看起来也是不错的解决方案。我想使用 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 脚本来执行此操作吗?如果有其他选择,我宁愿不使用 cron。
答案1
我强烈建议您使用以下方法,而不是从头开始编写脚本:监控。 我发现这一页这给了你一些基础知识,但我发现这里的实现有点草率。所以让我来解决这个问题。这将解释如何monit
在 Ubuntu 12.04 中设置。首先,monit
从存储库安装,如下所示:
sudo aptitude install monit
接下来,您需要调整邮件服务器设置,以便接收电子邮件警报。只需monit
像这样打开配置:
sudo nano /etc/monit/monitrc
现在查找具有邮件服务器设置的区域并插入此行:
set mailserver localhost
这是我为 Apache 使用的规则集。首先,创建配置文件:
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
该规则集检查80
localhost 地址上的端口127.0.0.1
,如果超时 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 设置来测试。但这应该很好。
您可以monit
在此处关注日志:
sudo tail -f -n 200 /var/log/monit.log
答案2
我希望您已经找到问题的根本原因并能够正确修复它。如果您或其他人需要解决方案,请尝试以下答案。
问题是您的服务有时可能会“挂起”,监控也必须能够赶上它。在下面的简单脚本中,我们将 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,因为它很简单。另一种选择是将其作为守护进程启动,但在我看来,这会带来不必要的复杂性。也可以使用其他(外部)调度程序,但我认为 cron 最简单。
希望这有帮助。