2010-01-30 119 views
12

我写了一个bash脚本来重启Apache,当它挂起并发送邮件给管理员。代码如下所示。如果Apache进程的数量为零,代码将重新启动Apache。问题是:Apache有时会挂起,进程仍然不是零,所以在这种情况下,脚本不会重新启动Apache。 需要的是:如何修改代码以重启Apache,如果它挂起并且进程不为零。bash脚本自动重启Apache

#!/bin/bash 
if [ `pgrep apache2 -c` -le "0" ]; then 
/etc/init.d/apache2 stop 
pkill -u www-data 
/etc/init.d/apache2 start 
echo "restarting....." 
SUBJECT="Apache auto restart" 
# Email To ? 
EMAIL="[email protected]" 
# Email text/message 
EMAILMESSAGE="apache auto restart done" 
# send an email using /bin/mail 
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE" 
fi 
+7

修复疾病,没有症状。你应该问如何确定为什么Apache挂起(可能在ServerFault中),然后修复它......而不是如何在挂起时重新启动它。 – Juliano

+0

为什么在这里重新发明轮子,在/etc/rc.d或类似的(取决于unix/linux安装)中找到的启动脚本有能力重启,但是再次检查错误日志,必须重新启动服务器,通常是/etc/rc.d/3/rc.httpd重启或类似... – t0mm13b

+1

嗨。朱利亚诺你是对的。我在寻找问题的根源,但我认为这种脚本是“必须拥有”的脚本,因为将来它有可能会挂起,这个脚本将暂时解决问题。 –

回答

29

我们曾经有阿帕奇有时段错误的机器上;这里是我们在保持Apache运行的同时试图调试问题的脚本。它每分钟左右从cron(以root身份)运行一次。它应该是不言自明的。

#!/bin/sh 
# Script that checks whether apache is still up, and if not: 
# - e-mail the last bit of log files 
# - kick some life back into it 
# -- Thomas, 20050606 

PATH=/bin:/usr/bin 
THEDIR=/tmp/apache-watchdog 
[email protected] 
mkdir -p $THEDIR 

if (wget --timeout=30 -q -P $THEDIR http://localhost/robots.txt) 
then 
    # we are up 
    touch ~/.apache-was-up 
else 
    # down! but if it was down already, don't keep spamming 
    if [[ -f ~/.apache-was-up ]] 
    then 
     # write a nice e-mail 
     echo -n "apache crashed at " > $THEDIR/mail 
     date >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Access log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_access/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Error log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_error/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     # kick apache 
     echo "Now kicking apache..." >> $THEDIR/mail 
     /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1 
     killall -9 apache2 >> $THEDIR/mail 2>&1 
     /etc/init.d/apache2 start >> $THEDIR/mail 2>&1 
     # send the mail 
     echo >> $THEDIR/mail 
     echo "Good luck troubleshooting!" >> $THEDIR/mail 
     mail -s "apache-watchdog: apache crashed" $EMAIL < $THEDIR/mail 
     rm ~/.apache-was-up 
    fi 
fi 

rm -rf $THEDIR 

我们也没搞清楚这个问题...

+7

'rm -rf'让我紧张。看起来你正在写两个文件。只是明确地删除它们,然后'rmdir $ THEDIR'。 –

+0

哪一个更好地测试Apache服务器,使用wget或使用/etc/init.d/httpd状态检查Apache的状态?我想使用wget会给服务器带来更多的压力。 – geckob

+2

我肯定会推荐使用一个实际的http请求,因为如果Apache只是挂起死锁或某些东西(即进程仍在运行),init脚本不会告诉你。如果你的服务器每分钟不能处理一个请求,崩溃的Apache是​​你最担心的; – Thomas

1

你可以尝试发送一个HTTP请求到apache的(例如使用wget --timeout=10),如果出该请求倍或失败(退出状态!= 0),你杀和重新启动Apache。

1

为什么Apache会挂起?你能找到原因吗?

有很多脚本和工具可以“守护”应用程序并监视它们。由于您似乎在Debian或Ubuntu上,请查看包daemondaemontools。我相信也有其他人。

2

过程的计数是否真的小于零?

这应该是足够了:

if ! pgrep apache2 -c >/dev/null; then 
+1

我不明白这是如何相关的,但它可能是真实的。 –