我想终止进程名称中包含 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
正如前面提到的pgrep
,pkill
您的朋友是:
sudo pkill `pgrep -u root foo`
如果由于某种原因您没有pgrep
和pkill
,您可以执行以下操作:
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}')