如何通过管道向kill命令传递参数

107

我需要搜索某个进程并杀死该进程。我写了这样一个命令:

ps -e | grep dmn | awk '{print $1}' | kill

当进程名称为dmn时。但是它没有起作用。我该如何按名称查找进程并将其kill掉。

9个回答

202
kill $(ps -e | awk '/dmn/ {print $1}')

10
请使用更新的$()语法:kill $(ps -e | grep dmn | awk '{print $1}')。这条命令的作用是杀死所有包含“dmn”关键字的进程。 - Stratus3D
11
供其他人参考,我不得不修改这个答案才能让它起作用:kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')。我不确定原因,也不想进一步探究。 - joshweir
2
@joshweir 这是因为否则 kill 尝试杀死正在尝试搜索模式的 'grep' 进程。 - meain
在每个awk后面不是需要加上\n吗?就像这样:awk '{print $1"\n"}' - Sopalajo de Arrierez
3
一如既往,避免使用无用的 grep(http://www.iki.fi/era/unix/award.html#grep); kill $(ps -e | awk '/dmn/ { print $1 }'(当然,也不要重复造轮子:pkill dmn)。 - tripleee

58

如果有多个进程需要删除,可以使用以下方法:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

注意:你需要从输出中移除grep进程本身,这就是为什么要使用grep -v grep的原因。


20
你可以通过将第一个字符放在方括号中来避免 grep 出现在你的 grep 结果中,例如:grep [d]mn。 - Oldskool
1
@Oldskool 不错的技巧。使用元字符来使grep正则表达式不匹配自身是个好主意。 - jcollado
不错的技巧,尽管这使得将其转换为shell脚本更加复杂。 - Metagrapher
kill: (15142): 操作不允许,即使在kill前添加sudo也是如此。 - alper

22

你可以使用

pkill dmn 

如果您的系统具有 pkill 命令


2
使用pkill代替killall,这是一个更好的选择。pkill在多个平台上都可用,而且没有不同的“含义”(例如,在Solaris上的killall等同于Linux上的killall5 - 也就是说,杀死所有进程)。 - plundra

5
如果您的系统上有pidof命令(我知道像ZSH这样的shell默认情况下会带有该命令,除非我弄错了),则可以执行以下操作。
kill -9 $(pidof dmn)

5

如果你知道镜像名称并有pidof命令,那么你可能不需要使用pipe。我是这样做的:

kill $(pidof synergyc)

$()我理解为它将输出转换为变量,kill可以使用该变量,基本上就像管道一样。比其他选项更短,更易于理解,但也可能不太灵活,更加直接。


5

除了其他人提到的,我喜欢使用awk的正则表达式功能:

kill $(ps | awk '/dmn/{print $1}')

3
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

大家好,我们可以使用for循环完成这个任务。

"一些搜索",这里是您想要搜索的进程名称,例如 "java",假设java进程的数量超过200个,逐个杀死将会非常麻烦。

所以你可以使用上面的命令。

谢谢。


1
当搜索结果可能为空时,最佳解决方案 - den_po

2

使用pgrep命令并带上-f选项。 kill $(pgrep -f dmn)


8
如果您有pgrep,为什么不直接使用pkill -f dmn - muru

2
您还可以使用killall命令:
killall dmn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接