sudo, um die Ausgabe von ps, awk, xargs zu beenden

sudo, um die Ausgabe von ps, awk, xargs zu beenden

Ich möchte Root-Prozesse beenden, die foo im Prozessnamen enthalten

sudo sh -c "ps aux | grep [f]oo  | awk '{print $2}' | xargs kill -15"

dieser Befehl schlägt fehl, da awk und xargs ignoriert werden.

sudo sh -c "ps aux | grep [f]oo  | awk '{print $2}' | xargs kill -15"

so kill erhält schlechte Argumente

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.

Antwort1

Das ist ein hässlicher Hack und killSie werden sich beschweren, aber es funktioniert (zumindest bei mir):

sudo kill `ps -ae | grep foo` &>/dev/null

Dieser &>/dev/nullTeil ist optional. Fügen Sie ihn hinzu, wenn Sie nicht alle killBeschwerden von sehen möchten.

Ich weiß, dass es dafür wahrscheinlich eine bessere Möglichkeit gibt, aber ich verwende diese.

Antwort2

Wie bereits erwähnt pgrepund pkillsind Ihre Freunde:

sudo pkill `pgrep -u root foo`

Wenn Sie aus irgendeinem Grund nicht über pgrepund verfügen pkill, können Sie Folgendes tun:

for n in $(ps -u root | grep foo | cut -d ' ' -f 2); do sudo kill $n; done

Antwort3

Ich glaube, Ihr eigentliches Problem liegt in den Anführungszeichen. In doppelten Anführungszeichen wird $2 erweitert, bevor es überhaupt an sh übergeben wird. Die einfachen Anführungszeichen, wie sie in Ihrem Code verwendet werden, isolieren dies nicht, da es sich nur um Anführungszeichen handelt. Versuchen Sie eine dieser Anführungsmethoden:

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

Antwort4

Auf diese Weise können Sie Probleme mit doppelten Anführungszeichen vermeiden. Das Ergebnis sollte dasselbe sein.

sudo kill -15 $(ps aux | grep '[f]oo' | awk '{print $2}')

verwandte Informationen