W bashpowinieneś 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:
psDaje listę wszystkich procesów.
- Te
grepfiltry, które opiera się na ciągu wyszukiwania, [p]to trick, aby zatrzymać Cię podniesienie rzeczywistego grepsam proces.
- Po
awkprostu daje ci drugie pole każdej linii, którym jest PID.
- Te
$(x)środki konstrukt wykonać xnastępnie podjąć swoje wyjście i umieścić go w wierszu poleceń. Wyjściem tego pspotoku 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, sleepw tym sleep 3600i grep sleep(ponieważ oba mają sleepw 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: grepnie 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, sleepale 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 :-)