我有一份工作,在 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>