查找高内存进程并杀死

思路:

  • 先查询出高内存的进程,再循环杀死

代码(killPid.sh):

#!/bin/sh
#添加本地执行路径
#source /etc/profile
#本文件为定时清理高内存的脚本文件,结合自动重启脚本,保证系统脚本能在一直在允许的内存范围内运行

nowtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`

echo ""
echo "$nowtime 开始检查"

#查询步骤思路:
#步骤1:先查出指定参数进程列表  “ps -e -o 'user,pid,args,tid,time,%mem,cmd'”
#步骤2:根据实际内存排序 “--sort -rsz”
#步骤3:取前10条数据
#
#得到初始数据:
#USER       PID COMMAND                       TID     TIME %MEM CMD
#root     16004 /www/server/php/74/bin/php  16004 00:00:09 16.2 /www/server/php/74/bin/php SwReptiles.php
#root      3077 /www/server/php/74/bin/php   3077 00:28:12 15.1 /www/server/php/74/bin/php Swver_v7.php
#
#步骤4:运用awk命令
#步骤5:对数据判断第6列的数据要大于15且小于50(因为这列是内存,可以随意定义允许的大小范围),且第七列等于  “/www/server/php/74/bin/php”
#步骤6:格式化只打印指定的列 第2列 第6列 第7列 第8列
#
#最终得到数据:
#16004 16.2 /www/server/php/74/bin/php SwReptiles.php
#3077  15.1 /www/server/php/74/bin/php Swver_v7.php
#
#其中 16004和3077为进程id(即PID),16.2和15.1为占用内存(%)


listarr=`ps -e -o 'user,pid,args,tid,time,%mem,cmd' --sort -rsz | head -10 |awk '$6>15 && $6<50 && $7=="/www/server/php/74/bin/php" {printf "%-18s %-20s %-20s %-80s\n",$2,$6,$7,$8}'`

#echo $listarr

OLD_IFS="$IFS"   #定义一个变量为默认IFS
IFS=$'\n'        #设置默认IFS为换行符
m=0

for id in $listarr
do
	m=`expr $m + 1`
	IFS="$OLD_IFS"

	n=0
	for var in $id
	do
		arr[$n]=$var 
		n=`expr $n + 1`
	done

	echo ""

	if [ ${#arr[@]} == 4 ]
	then

		echo "start killed PID "${arr[0]}

		echo "清除:"${arr[2]}" "${arr[3]}

		`kill ${arr[0]}`

		echo "kill end"

	else
		echo "获取到不正常的数据"
		echo “${#arr[@]}”

	fi

	echo ""

	IFS=$'\n'

done

if [ $m == 0 ]
then
	echo "没有需要kill的进程--"
fi

endtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`

echo "$endtime 检测完成"


IFS="$OLD_IFS"

可以结合宝塔定时器:

cd /www/wwwroot/study/
sh killshell.sh >>log_killshell.log 2>&1

个人博客地址:tper_pdy:查找高内存进程并杀死

你可能感兴趣的:(shell,Linux,开发语言,后端,shell)