In bashsollten Sie in der Lage sein:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Details zu seiner Arbeitsweise sind wie folgt:
- Das
psgibt Ihnen die Liste aller Prozesse.
- Die
grepFilter, die auf Ihrer Suchzeichenfolge basieren, [p]sind ein Trick, um zu verhindern, dass Sie den eigentlichen grepProzess selbst erfassen.
- Das
awkgibt Ihnen nur das zweite Feld jeder Zeile, das die PID ist.
- Das
$(x)Konstrukt bedeutet ausführen, xdann seine Ausgabe nehmen und in die Befehlszeile einfügen. Die Ausgabe dieser psPipeline in diesem Konstrukt oben ist die Liste der Prozess-IDs, sodass Sie am Ende einen Befehl wie erhalten kill 1234 1122 7654.
Hier ist ein Transkript, das es in Aktion zeigt:
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
und Sie können sehen, dass es alle Schläfer beendet.
Das grep '[p]ython csp_build.py'Bit etwas ausführlicher erklären :
Wenn Sie sleep 3600 &gefolgt sind ps -ef | grep sleep, neigen Sie dazu, zwei Prozesse sleepdarin zu haben, den sleep 3600und den grep sleep(weil beide sleepin ihnen sind, ist das keine Raketenwissenschaft).
Es ps -ef | grep '[s]leep'wird jedoch kein Prozess sleepdarin erstellt, sondern es wird erstellt, grep '[s]leep'und hier ist das Knifflige: Das grepfindet es nicht, weil es nach dem regulären Ausdruck "jedes Zeichen aus der Zeichenklasse [s](das folgt s) " sucht leep.
Mit anderen Worten, es wird gesucht, sleepaber der Grep-Prozess ist derjenige, grep '[s]leep'der nicht sleepdarin enthalten ist.
Als mir dies gezeigt wurde (von jemandem hier auf SO), fing ich sofort an, es zu benutzen, weil
- Es ist ein Prozess weniger als das Hinzufügen
| grep -v grep. und
- es ist elegant und hinterhältig, eine seltene Kombination :-)