这个标题其实不准确,我想表达的意思是:在检测到Nginx、httpd内存占用或系统负载较大时,自动重启相应进程。
为什么要这么大费周章?
1、为了自动化处理,在无人值守时一样能监控到系统状态并作出处置;
2、我们都知道,Nginx、httpd进程在使用service nginx restart命令时常常会出现意外,出现杀不死同时新进程也无法启动,最终反而使进程僵死,导致所有用户无法访问网站。所以需要先使服务停止,再检测是否还有同名服务,有的话再单独杀死;
3、为什么不周期性的重启?重启时会导致正在发起访问的用户得不到返回数据,所以重启应该尽量少做,所以只在其内存占用或系统负载较大时才做进程重启动作。
[php]#!/bin/sh
PID_MEM_MAX="85" #设置最大内存占用百分比
SYS_LOAD_MAX="5" #设置最大系统负载
NAME_LIST="httpd nginx" #设置需要监控的服务名称
for NAME in $NAME_LIST ;do
PID_MEM_SUM=0
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`
PID_MEM_LIST=`ps aux | grep $NAME | awk '{print $4}'`
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done
done
SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'` # 获取最近一分钟系统负载
echo " $(date +"%y-%m-%d %H:%M:%S") memory: $PID_MEM_SUM , load.avg: $SYS_LOAD" >>memuse.log
MEM_VULE=`awk 'BEGIN{print('"$PID_MEM_SUM"'>='"$PID_MEM_MAX"'?"1":"0")}'`
LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'`
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
for NAME in $NAME_LIST ;do
service $NAME stop
sleep 2
for pid in $(ps -ef | grep $NAME | grep -v grep | awk '{print $2}'); do
echo $pid
kill -9 $pid
done
service $NAME start
done
fi;[/php]
将以上保存为load2kill.sh ,然后crontab -e添加定时任务(每10分钟检测1次):
[php]*/10 * * * * /data/www/load2kill.sh & >/dev/null[/php]