プロセス名に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}')