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


647

我经常需要在编程期间杀死一个进程。

我现在的方式是:

[~]$ 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>

3
相信我!:'D您选择的第一个答案比您在答案中告诉您的解决方案复杂得多。我宁愿选择您的方式。
Santosh Kumar

Answers:


1397

在中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,您趋向于包含两个过程sleepsleep 3600和和grep sleep(因为它们都包含sleep在其中,所以这不是火箭科学)。

但是,ps -ef | grep '[s]leep'不会sleep在其中创建进程,而是创建进程,这grep '[s]leep'是一个棘手的问题:grep找不到它,因为它正在寻找正则表达式“来自字符类[s](即s)的任何字符,后跟” leep

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

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

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

2
@paxdiablo,您可以为此提供一个链接吗?我困惑为什么它起作用。
格伦·杰克曼

58
您只能使用awk- ps aux | AWK '/ [B] EAM / {打印$ 2}',没有grep的需要
约拉

20
最好只使用pgrep或pkill
NGix 2012年

2
有一个小问题-如果流程已经终止,则此行kill将以标准输出显示出来kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Lionel Chan

5
代替grep '[p]ython csp_build.py'您也可以使用:kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')grep -v返回不匹配的行。
usandfriends 2015年

138

如果有杀手

pkill -f csp_build.py

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


1
我对此进行测试时没有任何反应。
Orjanp

8
首先使用pgrep来验证您正确地grep了。然后在正确的模式上再次使用pkill。
ghostdog74

18
+1。pgrep并且pkill只要你照顾工作,正确指定的进程。默认情况下,仅进程名匹配,在这种情况下几乎可以肯定是“ python”。使用pgrep -f "python csp_build.py"相匹配的完整的命令。
mr.spuratic

3
您可能需要用pkill -9 -f csp_build.py
studgeek '16

1
这确实应该是被接受和投票最多的答案。其他所有这些都没有必要。我希望找到该页面的人阅读的内容超出了第一个答案。
Jason C

89

一班轮:

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

  • 打印第2列: awk '{print $2}'
  • sudo 是可选的
  • 运行kill -9 5124kill -9 5373等等(杀死-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 关键字
    • ķ顽疾具有此关键字LL工艺
    • 使用如: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"
}

提醒 -不要忘记重启bash shell(终端)以加载新功能。或source ~/.bash_profile在当前shell中运行以导入新功能(这是我的首选)。
a20

像这里的许多其他答案一样,这也遭受了对的无用使用的grep痛苦。请记住,grep x | awk '{ y }'如果将其替换为awk '/x/ { y }'
Tripleee,

1
@tripleee您链接到的网站属于您吗?我注意到您在各个评论部分都链接了它。您是否正在尝试建立SEO?
20

不,我对SEO没有兴趣。我希望提高认识。
三人房

1
..通过链接到您的网站,就好像它是已建立的授权网站一样。真好 另外,grep更快
a20


15

尝试使用

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

不得不改变一点。这工作了。谢谢。:) ps aux | grep'python csp_build.py'| 头-1 | 切-d“” -f 5 | xargs kill
Orjanp

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill为我工作。thanx
Rasika Perera

记住,孩子们,Awk可以做到所有事情grep,而大多数事情简单而优雅。琐碎的情况grep x y | awk '{ z }'总是写得更好awk '/x/ { z }' y-参见对的无用用法grep
三胞胎

11

您只能使用 pkill '^python*'用于正则表达式进程查杀。

如果您想查看要杀死的东西或在杀死之前找到的东西,请使用 pgrep -l '^python*' -l输出进程的名称。如果您不想使用 pkill,请仅使用:

pgrep '^python*' | xargs kill


8

使用pgrep-在许多平台上可用:

kill -9 `pgrep -f cps_build`

pgrep -f将返回所有巧合为“ cps_build”的PID


2
如果有的话pgrep,你也会有pkill。与往常一样,除非您知道为什么(默认)或将不起作用,否则不要使用kill -9kill -15kill -2
三胞胎

这似乎是@nathanael答案的更糟糕的解释,它忽略了错误的方向-9并使用了正确的现代命令替换语法。改为支持;当然,pkill答案仍然更好。
三胞胎

@tripleee在这种情况下,杀死-9正是我想要的-极端偏见地终止所有犯罪者。而且,我已经使用kill -9多年了,没有任何问题。我认为,总会有一个纯粹主义者阵营与一个东西搞定的现实主义者阵营,而我属于后者(就此而言)。
a20

您是否错过了“除非您知道为什么”部分?我全力以赴以完成工作,但这是射击自己直到发现-9真正含义的惯用方法之一。
Tripleee '17

@tripleee嗨,三胞胎,我最近发现您是对的,kill -15是一个更好的选择,因为它使应用程序有机会优雅地杀死自己。我已经相应地更改了代码:stackoverflow.com/a/30486159/163382
a20

6

这只会返回pid

pgrep -f 'process_name'

因此,要在一行中杀死任何进程:

kill -9 $(pgrep -f 'process_name')

或者,如果您知道进程的确切名称,也可以尝试使用pidof:

kill -9 $(pidof 'process_name')

但是,如果您不知道该进程的确切名称,pgrep那就更好了。

如果有多个运行相同名称的进程,并且您想杀死第一个进程,则:

kill -9 $(pgrep -f 'process_name' | head -1)

另请注意,如果您担心区分大小写,则可以像在grep中一样添加-i选项。例如:

kill -9 $(pgrep -fi chrome)

有关信号,并在p纤ep更多信息man 7 signalman signalman pgrep


5

你可以用awk和backtics来做

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$ 2在awk中打​​印第2列,并且backtics运行所打印的语句。

但是更干净的解决方案是让python进程将其进程ID存储在/ var / run中,然后您可以简单地读取该文件并杀死它。


难道您不会同时杀死5124和5373进程吗?我想这不是问题。
Orjanp

这应该没问题,但是您总是可以添加另一个grep来排除grep进程:grep和awk之间的“ grep -v grep”
AlexanderKjäll2010年

使用稍微修改的命令进行了测试。但是它没有杀死进程,只打印了杀死<pid>。ps auxf | grep'[p] ython csp_build.py'| awk'{print“ kill” $ 2}'
Orjanp

只需要与系统交换打印的“ kill” $ 2语句(“ kill” $ 2)。然后就可以了。:)
Orjanp

5

我的任务是杀死所有放置在特定目录中的与regexp匹配的东西(在硒测试之后,一切不会停止)。这为我工作:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

-9选择kill也许太激进了。它不允许他们释放资源。
Birei 2014年

真好!唯一考虑可能存在多个匹配过程的事实!一个小注意事项:也许您可能想在管道中添加“ grep -v grep”或类似的东西,以确保grep进程本身不会出现在您的进程列表中。
布拉德·帕克斯

kill接受多个进程,因此循环基本上是无用的;并且如本页其他地方所述,kill -9除非您知道该流程不会响应just,否则您不应使用kill
Tripleee '18

删除-9没什么大不了的,为什么要投票。您最好编辑答案。
Serge

5

要通过关键字杀死进程midori,例如:

kill -SIGTERM $(pgrep -i midori)


3

仅使用awk(和ps)的方法:

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

通过使用字符串相等性测试,我可以防止与此过程本身匹配。


出于某种原因,我在“ python csp_build.py”上没有获得成功。但是仅“ python”命中。
Orjanp

3
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

由于每日限制而无法+1,但值得ps配合使用with -o选项。
P Shved

PS不给我太多。[〜] $ ps PID TTY TIME CMD 6365点/ 6 00:00:00 ps 29112点/ 6/6 00:00:00 bash
Orjanp 2010年

3

给-f pkill

pkill -f /usr/local/bin/fritzcap.py

.py文件的确切路径是

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m


1

从常见的PPID开始杀死我们自己的进程非常常见,与该标志关联的pkill–P对我来说是赢家。使用@ ghostdog74示例:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30


1

在某些情况下,我想像这样同时杀死进程:

➜〜睡1000&
[1] 25410
➜〜睡1000&
[2] 25415
➜〜睡1000&
[3] 25421
➜〜睡眠不足
25421 25415 25410
➜〜杀死`pidof sleep`
[2]-25415终止睡眠1000                                                             
[1]-25410已终止睡眠1000
[3] + 25421终止睡眠1000

但是,我认为您的情况有点不合适(可能在后台运行python a,python b,python x ...)。


1

如果pkill -f csp_build.py没有杀死进程,则可以添加-9发送一个杀死信号,该信号不会被忽略。即pkill -9 -f csp_build.py


1

解决方案是使用精确的模式过滤进程,解析pid并构造用于执行kill进程的参数列表:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

文档说明

ps实用程序显示标题行,其后是包含有关具有控制终端的所有进程的信息的行。

-e显示有关其他用户进程的信息,包括那些

-f显示uid,pid,parent pid,最近的CPU使用率,进程启动

grep的实用搜索任何给定的输入文件,选择该行

-e pattern,--regexp = pattern指定在搜索输入期间使用的模式:如果输入行与任何指定的模式匹配,则选择输入行。当使用多个-e选项指定多个模式时,或者当模式以破折号('-')开头时,此选项最有用。

xargs-构造参数列表并执行实用程序

杀死 -终止或发出信号

9的信号- KILL(非开捕,不可忽视杀灭)

范例

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

我用它来杀死正在被脚本猛击和cpu重击的Firefox :)用您想死的应用程序替换“ Firefox”。我在Bash Shell上-OS X 10.9.3 Darwin。

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


更换grep Firefox | awk 'NR == 1 { next } ...'awk 'NR == 1 || $11 !~ /Firefox/ { next } ...'不仅节约了处理,而且还提高了精度。也不难摆脱sort | uniq纯Awk的问题(当然这uniq | sort是错误的-它会丢失所有不相邻的重复项,并通过不必要地对的输出进行排序来隐藏错误uniq)。
Tripleee '18

0

我使用gkill processname,其中gkill是以下脚本:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

注意:它不会杀死在命令行中包含“ grep”的进程。


1
像the牛棚的许多其他重塑一样,这被无用的使用grep和其他常见的shell脚本反模式所困扰。
三胞胎

-1

以下命令将很方便:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

例如。, ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

如果该过程仍然失败,请使用“ -9”扩展名来强制终止,如下所示:

kill -9 $(ps -elf | grep top| awk {'print $4'})

希望有帮助...!


-1

在bash中找到并杀死所有进程。

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'-给出与模式匹配的正在运行的进程详细信息(uname,pid等)的列表。输出列表中grep也包含搜索该命令的命令。现在,为了杀死它,我们需要忽略此grep命令过程。
  • ps -ef | grep '<exec_name>' | grep -v 'grep'-添加另一个grep -v 'grep'会删除当前的grep进程。
  • 然后使用awk单独获取进程ID。
  • 然后将此命令保留在内部$(...)并将其传递给kill命令,以杀死所有进程。

-1

您可以使用以下命令列出该命令的pid。使用top或更好地使用htop查看linux中的所有进程。在这里我想杀死一个名为

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

并验证pid。必须正确。要杀死它们,请使用kill命令。

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

例如:-来自htop进程列表。

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

这解决了我的问题。如果不小心中止了进程,请务必准备重新启动进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.