我想終止進程名稱中包含 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
and 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}')