Ich möchte alle Prozesse beenden, die einer bestimmten Kette entsprechen. Hier ist mein Skript, das ziemlich gut funktioniert:
echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill
Nun möchte ich dieses Skript von einem anderen Benutzer über `su -c ausführen:
echo password | su -c "echo `ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print $2 }'` | xargs kill" userName;
Mein Problem besteht darin, dass bei grep verySpecificChain
Übereinstimmungen mit mehreren Prozessen nur das erste Element an Folgendes übergeben wird xargs kill
:
30598 ==> killed
bash: line 1: 30599: command not found ==> Not killed
bash: line 2: 30600: command not found ==> Not killed
bash: line 3: 30606: command not found ==> Not killed
Ich würde wirklich gern verstehen, warum su -c
sich das Verhalten mit oder ohne den Befehl ändert.
Ich verwende GNU Bash, Version 4.2.53(1)-Release (x86_64-redhat-linux-gnu) auf Fedora 20.
Antwort1
Nurpkill -f verySpecificChain
Antwort2
Ich kann nicht erklären, was in Ihrem Beispiel genau fehlschlägt (also gebe ich zu, dass es eine Art Voodoo-Programmierung meinerseits ist), aber dies ist ein Fix, der (fast – siehe unten*) in meiner Bash (Debian) funktioniert:
- innen loswerden
echo
; - Flucht
$2
.
Ergebnis:
echo password | su -c "ps aux | grep verySpecificChain | grep -v grep | /usr/bin/awk '{ print \$2 }' | xargs kill" userName;
*Ich habe „funktioniert fast“ geschrieben, weil Debian mir nicht erlaubt, su
das Passwort in einer Pipe zu wiederholen. Ich muss es ohne Initiale ausführen echo
und das Passwort interaktiv eingeben. Ich denke, das ist in Fedora des OP kein Problem.