
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 kill
Sie werden sich beschweren, aber es funktioniert (zumindest bei mir):
sudo kill `ps -ae | grep foo` &>/dev/null
Dieser &>/dev/null
Teil ist optional. Fügen Sie ihn hinzu, wenn Sie nicht alle kill
Beschwerden 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 pgrep
und pkill
sind Ihre Freunde:
sudo pkill `pgrep -u root foo`
Wenn Sie aus irgendeinem Grund nicht über pgrep
und 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}')