pkill的简单实现

life is short.

生活中遇到一个问题:我要删除进程,然而我并不知道 pid, 只知道 name 或是 name 的一部分,譬如 nginx、 node 等。 如果有 pid 的话,直接 kill -9 pid 就可以了,现在只知道 name,那我想到的是首先在进程 table 中搜索一把,找到 pid 然后一一删除。因为需要经常操作,所以我就写了个 killp 的工具。后来不经意间发现原来 linux 下本就有个 pkill 的工具,名字还真是高度相似,←_←

pkill 的功能比较强,可以带很多参数,我也不想一一介绍,i dont care。我现在只知道 pkill yes 就可以删除所有 name 为 yes 的进程。如果想了解更多,直接 man pkill 去吧。

下面是我的 killp 的实现,一个 shell 脚本,供参考:

  1. #!/bin/bash
  2. if [ $# -lt 1 ]; then
  3.     echo "help: killp <process name=>"
  4.     exit
  5. fi
  6.  
  7. pids=`ps aux | grep -v grep | grep -v killp | grep $1 | awk '{print $2}'`
  8.  
  9. for pid in $pids ; do
  10.     echo "process $1: kill -9 $pid"
  11.     kill -9 $pid
  12. done

保存文件 killp ,然后 chmod a+x killp ,然后扔到 bin 目录下就好了。

解释

  • $# -lt 1 是判断 shell 脚本至少有 1 个参数,也就是进程名啦;
  • ps aux 查询所有的进程;
  • grep -v 排除本进程本身的干扰;
  • awk '{print $2}' 摘取 pid 列;
  • for ... ; do ...; done 遍历删除。

Tags: 

Article type: