为什么会写这篇文章呢,先说一下背景,因为一个生产环境的机器内存占用一直很高,经过排查发现是一个 consumer 的消费脚本中并发 http client 没有 close,导致定时每小时跑完的脚本一直在那里放着占用内存,时间久了内存占用就上来了,很快我就上了个 patch 修复了这个问题,但是那些跑完的脚本怎么处理呢?还用说嘛,当然要 kill 掉了。
脚本
手动每个去 kill 那真是太慢了,直接找个批量处理的脚本,将以下内容保存为 kill.sh,赋予执行权限,传入脚本的名称即可批量 kill 掉。
./kill.sh procedure_name
#!/bin/sh
if [ $# -lt 1 ]
then
echo "缺少参数:procedure_name"
exit 1
fi
PROCESS=`ps -ef|grep $1|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
echo "Kill the $1 process [ $i ]"
kill -9 $i
done
一句话命令
感觉上面的脚本麻烦,可以直接使用下面的一句来实现。
ps -ef | grep procedure_name | grep -v grep | awk '{print $2}' | xargs kill -9
总结
杀掉脚本之后,内存立刻恢复正常占用,顿时感觉清爽了许多。
保证良好的编码习惯,一些资源用过之后及时 close。
定期查看生产环境的各种 logs,查找资料并解决报错,技术积累大部分来源于解决生产环境问题。