思路:
- 先查询出高内存的进程,再循环杀死
代码(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:查找高内存进程并杀死