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

pgrep正如已經提到的pkill,你是朋友:

sudo pkill `pgrep -u root foo`

如果你因為某些原因沒有pgrepand 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}')

相關內容