sudo 终止 ps、awk、xargs 的输出

sudo 终止 ps、awk、xargs 的输出

我想终止进程名称中包含 foo 的 root 拥有的进程

sudo sh -c "ps aux | grep [f]oo  | awk '{print $2}' | xargs kill -15"

由于 awk 和 xargs 被忽略,该命令失败。

sudo sh -c "ps aux | grep [f]oo  | awk '{print $2}' | xargs kill -15"

因此 kill 会收到错误的参数

kill pid ...              Send SIGTERM to every process listed.
  kill signal pid ...       Send a signal to every process listed.
  kill -s signal pid ...    Send a signal to every process listed.
  kill -l                   List all signal names.
  kill -L                   List all signal names in a nice table.
  kill -l signal            Convert between signal numbers and names.

答案1

这是一个丑陋的黑客,并且kill会抱怨,但它有效(至少对我来说):

sudo kill `ps -ae | grep foo` &>/dev/null

&>/dev/null部分是可选的;如果您不想看到所有的kill投诉,请将其包括在内。

我知道可能有更好的方法可以做到这一点,但这就是我所使用的。

答案2

正如前面提到的pgreppkill您的朋友是:

sudo pkill `pgrep -u root foo`

如果由于某种原因您没有pgreppkill,您可以执行以下操作:

for n in $(ps -u root | grep foo | cut -d ' ' -f 2); do sudo kill $n; done

答案3

我认为你真正的问题在于引用。在双引号中,$2 在传递给 sh 之前就被展开了。代码中使用的单引号并不能隔离这一点,因为它们只是引用的字符。尝试以下引用方法之一:

sh -c 'ps aux | grep [f]oo | awk '\''{ print $2 }'\'

sh -c $'ps aux | grep [f]oo | awk \'{ print $2 }\''

sh -c "ps aux | grep [f]ox | awk '{ print \$2 }'"

答案4

这样就可以避免双引号问题。结果应该是一样的。

sudo kill -15 $(ps aux | grep '[f]oo' | awk '{print $2}')

相关内容