2012-04-03 6 views
2

Ich habe dieses Skript, das einfach tötet eine AppBASH - kommen seltsame Zeichen aus einem Rohr aus

KEY_NAME=/some/path 
kill `ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'` 
exit 0 

Wenn ich den Kill-Befehl manuell als oneliner schreiben, als es funktioniert. Aber ich muss es als Skript ausführen, das nicht funktioniert. Also habe ich versucht, es zu debuggen und hier ist das Ergebnis

[[email protected] logs]$ bash -x ./script.sh 
+ KEY_NAME=/some/path 
++ ps -ef 
++ grep /some/path 
++ grep -v grep 
++ awk '{ print $2 }' 
+ kill $'20557\r' 
: arguments must be process or job IDs 
+ exit 0 

Warum halte ich diese seltsamen Zeichen immer auf der kill Linie? Wie kann ich sie loswerden?

+0

Was passiert, wenn Sie Kopf -1 zu dieser Pipeline hinzufügen? – alberge

+1

Haben Sie 'killall' probiert? Aber wenn du dein eigenes Programm tötest, [solltest du es vielleicht noch einmal überdenken] (http://mywiki.wooledge.org/ProcessManagement). – l0b0

+0

@ l0b0 Ich habe nicht und ich werde wahrscheinlich nicht. Ich möchte nicht damit enden, mehr Prozesse zu erledigen, als ich eigentlich hätte tun sollen ... – user219882

Antwort

1

könnte der Fall sein, ist die Anzahl der PIDs zurückgegeben werden mehr als 1 Ändern Sie Ihre Linie zu

ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'|xargs kill 
+0

Das hat geholfen. Vielen Dank... – user219882

3

Der Grund, warum Sie Kauderwelsch Zeichen erhalten, ist wahrscheinlich (ich kann es nicht überprüfen, weil ich keinen Zugriff auf Ihre Umgebung habe), weil die Untershell mehr als eine Zeile zurückgibt.

Try this:

KEY_NAME=/some/path 
for pid in $(ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }') 
    do 
    kill $pid 
    done 
exit 0 
1

Sie konnten alles zu pkill mit einem Aufruf ersetzen. Mit der Option -f wird die vollständige Befehlszeile zum Abgleichen verwendet (nicht nur der Prozessname), sodass Sie immer noch mit Pfaden übereinstimmen können.

pkill -f $KEY_NAME 

Abgesehen davon, dass es einfacher ist, gibt es Ihnen eine leichtere Kontrolle darüber, was Sie töten sollen, z. nur Prozesse löschen, die einem bestimmten Benutzer/einer bestimmten Gruppe gehören, oder nur die ältesten/neuesten.