sudo は ps、awk、xargs の出力を強制終了します。

sudo は ps、awk、xargs の出力を強制終了します。

プロセス名にfooを含むルート所有のプロセスを終了したい

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}')

関連情報