通过名称而不是 pid 来终止多个进程

通过名称而不是 pid 来终止多个进程

我有一份工作,在 Ubuntu Server 14.04 上启动 2-5 个命令副本。

我正在尝试找出最简单的方法(即如果可能的话,使用单个命令行而不是脚本)kill。真正的诀窍是我正在使用Ansible在数十台服务器之间发送临时命令,这就是为什么调用每个进程都很耗时。

例子:

ps aux | grep bash 
user 1031 0.0 0.0  4444  652 ?      Ss  Aug15 0:00 /bin/sh -c /home/user/start-cacheable.bash
user 1032 0.0 0.1 12400 1432 ?      S   Aug15 0:00 /bin/bash /home/user/start-cacheable.bash
user 1327 0.0 0.3 12744 2254 tty1   S   Aug15 0:00 -bash

现在从这里开始,我将运行kill 1031 1032。是否有一个干净的命令可以完成这项工作?

答案1

@jjlin 的回答可能有效。

pgrep/pkill但要解释和的工作原理killall

killall 寻找进程名称只有 - 这是看到的部分/proc/<pid>/comm

pgrep/pkill 默认执行相同的操作,但也可以在参数中查找匹配项(-f),使其再次匹配/proc/<pid>/cmdline

基本上,默认情况下仅ps -A考虑看到的字符串。

例子:

process name (comm): sshd
full command/arguments (cmdline): /usr/sbin/sshd -f /etc/ssh/sshd_config

现在 -kilall/pkil sshd可以工作(故意打错字,不要这样做;)
killall /usr/sbin/sshd不行因为路径不是进程名称的一部分,所以
您可以使用它来检查pgrep -lf sshd_config(即 pkill -f)

然后,这里还有其他需要考虑的事情。Killall可能只匹配命令名的前 15 个字节(参见killall -e),是否需要正则表达式,或者您是否想利用进程组等。

注意:/proc/... 文件以空分隔,因此复制/粘贴时要小心

答案2

你可以用这个。

ps aux | grep <your keyword> | grep -v grep | awk  '{print $2}' | xargs kill -9

列出匹配的进程,过滤掉 grep 进程本身,获取 PID,将其传递给 kill -9。

使用 kill -9 之前进行测试

答案3

尝试

pkill start-cacheable.bash

答案4

您可以使用

killall <process name>

相关内容