Shell 脚本到 -9 根据名称杀死

mre*_*req 32 bash process kill

有没有办法(也许是脚本)如何自动化这个过程:

petr@sova:~$ ps -ef | grep middleman
petr     18445  2312  1 12:06 pts/2    00:00:01 /home/petr/.rvm/gems/ruby-1.9.3-p362/bin/middleman                                                                  
petr     18581 13621  0 12:08 pts/0    00:00:00 grep --color=auto middleman
petr@sova:~$ kill -9 18445
Run Code Online (Sandbox Code Playgroud)

不幸的是,pkill太弱了,因为我必须-9选择 on kill

Ger*_*ger 56

有一个比 qbi 更简单的解决方案:killall让我们按名称杀死进程,并且可以指定信号。

killall -9 middleman
Run Code Online (Sandbox Code Playgroud)

有关man killall更多信息和额外选项(有很多),请参见。

顾名思义,这确实将信号发送到所有名为middleman. 但这与其他方式(如pkill)并没有什么不同。此外,pkill -9 middleman将针对名称匹配但不等于的进程middleman,例如middleman2,以及。

  • 杀死所有中间人?哦亲爱的... (5认同)
  • `killall` 为胜利! (2认同)

qbi*_*qbi 38

您可以使用 shell 为您完成此任务:

kill -9 $(pidof middleman)
Run Code Online (Sandbox Code Playgroud)

shellpidof middleman首先执行命令。pidof(8)的输出是进程 ID。因此,shell 将pidof-command 替换为进程 id 并执行kill -9 18845(或任何正确的进程 id)。


Rob*_*sak 16

其他答案完全正确,但我不妨添加第三个选项,以便在此处记录所有内容。您还可以使用:

pkill -9 middleman
Run Code Online (Sandbox Code Playgroud)

有关man pkill更多信息和额外选项,请参阅。

您使用这些方法中的哪一种并不重要。他们都会工作。但是如果您想以某种方式修改行为,了解这些选项是否有用,因为相应的手册页显示了其他可用的匹配选项。


小智 13

只是为了好玩,我想添加一个更手动的老派方式

kill -9 `ps aux | grep middleman | awk '{print $2}'`
Run Code Online (Sandbox Code Playgroud)


jll*_*gre 13

pkill -9 -f middleman
Run Code Online (Sandbox Code Playgroud)

-f选项使其匹配完整的命令行,而不仅仅是进程名称。

请注意,这-9应该是最后的信号,而不是常规使用的信号。