W bash
powinieneś być w stanie wykonać:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Szczegóły dotyczące jego działania są następujące:
ps
Daje listę wszystkich procesów.
- Te
grep
filtry, które opiera się na ciągu wyszukiwania, [p]
to trick, aby zatrzymać Cię podniesienie rzeczywistego grep
sam proces.
- Po
awk
prostu daje ci drugie pole każdej linii, którym jest PID.
- Te
$(x)
środki konstrukt wykonać x
następnie podjąć swoje wyjście i umieścić go w wierszu poleceń. Wyjściem tego ps
potoku w powyższej konstrukcji jest lista identyfikatorów procesów, więc otrzymujesz polecenie podobne do kill 1234 1122 7654
.
Oto transkrypcja pokazująca go w akcji:
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
i widać, jak kończy wszystkie podkłady.
Wyjaśniając grep '[p]ython csp_build.py'
nieco bardziej szczegółowo:
Kiedy to sleep 3600 &
nastąpi ps -ef | grep sleep
, masz tendencję do uzyskania dwóch procesów, sleep
w tym sleep 3600
i grep sleep
(ponieważ oba mają sleep
w sobie, to nie jest nauka o rakietach).
Jednak ps -ef | grep '[s]leep'
nie utworzy w nim procesu sleep
, zamiast tego utworzy grep '[s]leep'
i oto podstęp: grep
nie można go znaleźć, ponieważ szuka wyrażenia regularnego „dowolny znak z klasy znaków [s]
(która jest s
), po której następuje leep
.
Innymi słowy, szuka, sleep
ale proces grep jest tym, grep '[s]leep'
czego nie ma sleep
.
Kiedy pokazano mi to (przez kogoś tutaj na SO), natychmiast zacząłem go używać, ponieważ
- to jeden proces mniej niż dodawanie
| grep -v grep
; i
- to eleganckie i podstępne, rzadkie połączenie :-)