如果 tomcat7 服务没有响应,请重新启动

如果 tomcat7 服务没有响应,请重新启动

我在 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

该规则集检查80localhost 地址上的端口127.0.0.1,如果超时 15 秒,则重新启动 Apache 服务。我还连接了一个负载平均规则,该规则将每分钟检查一次负载,如果负载连续 5 个周期高于 7,它将重新启动服务apache

对于 Tomcat,调整规则在本页—如上所述— 看起来会像这样。首先在monitconfig 目录中打开一个文件进行编辑,如下所示:

/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 最简单。

希望这有帮助。

答案3

监控是一个很好的工具。它将监控服务或服务器状态,例如雄猫(或硬盘空间等)并且它将重新启动它们,根据您在配置文件中输入的内容向您发送电子邮件等,比 Bash 脚本(您可能更喜欢简单性)更强大和灵活。

相关内容