使用bash和regex在一行中查找并终止进程

我经常需要在编程期间终止进程

我现在的做法是:

[~]$ps aux|grep'python csp_build.py'
用户5124 1.0 0.3 214588 13852 pts/4 Sl+11:19 0:00 python csp_build.py
用户5373 0.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|u build.py'kill<返回pid的正则表达式>

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

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

其运作详情如下:

  • ps提供所有进程的列表
  • grep根据您的搜索字符串进行筛选,[p]是一种阻止您选择实际的grep进程本身的技巧
  • awk只提供每行的第二个字段,即PID
  • $(x)构造意味着执行x,然后获取其输出并将其放在命令行上。上面构造内部的ps管道的输出是进程ID列表,因此您最终会得到一个类似于kill 1234 1122 7654的命令

下面是一份记录,显示了它的实际作用:

pax>睡眠3600&
[1] 2225
帕克斯>睡眠3600&
[2] 2226
帕克斯>睡眠3600&
[3] 2227
帕克斯>睡眠3600&
[4] 2228
帕克斯>睡眠3600&
[5] 2229
帕克斯>kill$(ps aux | grep'[s]leep'| awk'{print$2}')
[5] +终止睡眠3600
[1] 终止睡眠3600
[2] 终止睡眠3600
[3] -终止睡眠3600
[4] +终止睡眠3600

你可以看到它终止了所有的睡眠


更详细地解释grep'[p]ython csp\u build.py'位:

当您执行睡眠3600&amp之后是ps-ef | grep sleep,你往往会得到两个sleep过程,即sleep 3600grep sleep(因为它们都有sleep,这不是火箭科学)

然而,ps-ef | grep'[s]leep'不会创建一个包含sleep的进程,而是创建grep'[s]leep',这里有一个棘手的地方:grep找不到它,因为它正在寻找正则表达式“字符类中的任何字符”(即s)然后是leep

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

当我看到这一点时(有人在这里演示),我立即开始使用它,因为

  • 这比添加| grep-v grep少了一个过程
  • 它是优雅的和卑鄙的,一种罕见的组合:-)

发表评论