协慌网

登录 贡献 社区

使用 bash 和 regex 在一行中查找并杀死一个进程

我经常需要在编程过程中杀死一个进程。

我现在的方法是:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

如何自动提取进程 ID 并在同一行中将其杀死?

像这样:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

答案

bash ,您应该能够执行以下操作:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

其工作细节如下:

  • ps为您提供了所有进程的列表。
  • grep过滤器会根据您的搜索字符串[p]过滤,这是一种技巧,可阻止您grep进程。
  • awk只是给您每行的第二个字段,即 PID。
  • $(x)构造意味着执行x然后获取其输出并将其放在命令行中。上面构造中的ps管道的输出是进程 ID 的列表,因此您最终得到的命令是kill 1234 1122 7654

这是一个记录,显示了它的作用:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

您会看到它终止了所有的卧铺车厢。


更详细地解释grep '[p]ython csp_build.py'

当您sleep 3600 &接着是ps -ef | grep sleep ,您倾向于获得两个带有sleep进程,即sleep 3600grep sleep (因为它们都sleep ,这不是火箭科学)。

但是, ps -ef | grep '[s]leep'不会创建一个带有sleep的进程,而是创建grep '[s]leep' ,这有点棘手: grep找不到它,因为它正在寻找正则表达式 “ any 字符类[s] (是s )中leep

换句话说,它正在寻找sleep但是 grep 进程是grep '[s]leep' ,其中没有sleep

当我(有人在 SO 上显示给我看)时,我立即开始使用它,因为

  • | grep -v grep少了一个过程。 | grep -v grep ; 和
  • 它优雅隐秘,是一种罕见的组合:-)

如果你有杀伤力,

pkill -f csp_build.py

如果只想对进程名称(而不是完整的参数列表)进行 grep 设置,请不要使用-f

一班轮:

ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

  • 打印第 2 列: awk '{print $2}'
  • sudo是可选的
  • 运行kill -9 5124kill -9 5373等(kill -15 更为优美,但稍微慢一些)

奖金:

我在. bash_profile 中定义了 2 个快捷方式功能(〜/ .bash_profile 用于 osx,您必须查看对 * nix 机器有效的功能)。

  1. p关键字
    • 罗列出包含关键字均P rocesses
    • 用法,例如: p csp_buildp python

bash_profile 代码:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka关键字
    • ķ弊病有这个关键字者 A的过程
    • 用法,例如: ka csp_buildka python
    • 可选的杀死级别,例如: ka csp_build 15ka python 9

bash_profile 代码:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}