最近半年碰到了几次,由于“蜘蛛”导致机器挂掉了,所以想出了这个方法,等系统负载过高的情况下,直接重启Apache。这就是Twitter提倡的那样,等进程杀死你之前,你先杀死他(原话不记得了) 。其实这种方法早就在业界使用了。
来吧,看看我写的脚本。
checkload.sh
- #!/bin/sh
- TOP_SYS_LOAD_NUM=5
- SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
- echo $(date +"%y-%m-%d") `uptime`
- if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
- then
- echo "##" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
- pkill httpd
- sleep 10
- for i in 1 2 3
- do
- if [ `pgrep httpd | wc -l` -le 0 ]
- then
- /home/app/httpd/bin/apachectl start
- sleep 30
- echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
- fi
- done
- else
- if [ `pgrep httpd | wc -l` -le 0 ]
- then
- /home/app/httpd/bin/apachectl start
- sleep 30
- echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
- fi
- fi
然后在crontab里增加定时执行的命令
*/2 * * * * (/root/checkload.sh >>/root/checkload.log)
每两分钟检查一次系统负载。