In bash
sollten 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
ps
gibt Ihnen die Liste aller Prozesse.
- Die
grep
Filter, die auf Ihrer Suchzeichenfolge basieren, [p]
sind ein Trick, um zu verhindern, dass Sie den eigentlichen grep
Prozess selbst erfassen.
- Das
awk
gibt Ihnen nur das zweite Feld jeder Zeile, das die PID ist.
- Das
$(x)
Konstrukt bedeutet ausführen, x
dann seine Ausgabe nehmen und in die Befehlszeile einfügen. Die Ausgabe dieser ps
Pipeline 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 sleep
darin zu haben, den sleep 3600
und den grep sleep
(weil beide sleep
in ihnen sind, ist das keine Raketenwissenschaft).
Es ps -ef | grep '[s]leep'
wird jedoch kein Prozess sleep
darin erstellt, sondern es wird erstellt, grep '[s]leep'
und hier ist das Knifflige: Das grep
findet 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, sleep
aber der Grep-Prozess ist derjenige, grep '[s]leep'
der nicht sleep
darin 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 :-)