Linux Shell脚本实现根据进程名杀死进程

起因

  为什么会写这篇文章呢,先说一下背景,因为一个生产环境的机器内存占用一直很高,经过排查发现是一个 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

总结

杀掉脚本之后,内存立刻恢复正常占用,顿时感觉清爽了许多。

  1. 保证良好的编码习惯,一些资源用过之后及时 close。
  2. 定期查看生产环境的各种 logs,查找资料并解决报错,技术积累大部分来源于解决生产环境问题。

评论