现在的位置: 首页 > IT运维 > 正文

彻底杀死nginx并重启

2014年11月29日 IT运维 ⁄ 共 1181字 暂无评论 ⁄ 被围观 155+

这个标题其实不准确,我想表达的意思是:在检测到Nginx、httpd内存占用或系统负载较大时,自动重启相应进程。

为什么要这么大费周章?

1、为了自动化处理,在无人值守时一样能监控到系统状态并作出处置;

2、我们都知道,Nginx、httpd进程在使用service nginx restart命令时常常会出现意外,出现杀不死同时新进程也无法启动,最终反而使进程僵死,导致所有用户无法访问网站。所以需要先使服务停止,再检测是否还有同名服务,有的话再单独杀死;

3、为什么不周期性的重启?重启时会导致正在发起访问的用户得不到返回数据,所以重启应该尽量少做,所以只在其内存占用或系统负载较大时才做进程重启动作。

#!/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;

将以上保存为load2kill.sh ,然后crontab -e添加定时任务(每10分钟检测1次):

*/10 * * * * /data/www/load2kill.sh & >/dev/null

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#