bash脚本自动重启Apache

use*_*ksa 17 apache bash

我写了一个bash脚本,当它挂起并向管理员发送电子邮件时重启Apache.代码如下所示.如果Apache进程的数量为零,代码将重新启动Apache.问题是:Apache有时挂起,进程仍然不为零,所以在这种情况下脚本不会重启Apache.需要的是:如果挂起并且进程不为零,我如何修改代码以重启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="me@mydomain.com"
# Email text/message
EMAILMESSAGE="apache auto restart done"
# send an email using /bin/mail
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE"
fi
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 35

我们曾经有时在机器上进行Apache segfaulting; 这是我们用来尝试调试问题同时保持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=yourself@example.com
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
Run Code Online (Sandbox Code Playgroud)

我们从未弄清楚问题......

  • 那个`rm -rf`让我很紧张.看起来你正在写两个文件.只需明确删除它们然后`rmdir $ THEDIR`. (8认同)
  • 我肯定会建议使用实际的http请求,因为如果Apache只挂起死锁或其他东西(即进程仍然在运行),init脚本就不会告诉你.如果你的服务器无法每分钟处理一个请求,那么崩溃的Apache是​​你最不担心的;) (2认同)
  • @jessica在你做`rmdir $ THEDIR`之前,你必须要'rm $ THEDIR/mail $ THEDIR/robots.txt`.还要考虑传递`-O $ THEDIR/robots.txt`而不是`-P $ THEDIR`来覆盖输出文件,如果之前运行的脚本由于某种原因没有清理. (2认同)