Em bash, você deve ser capaz de:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Os detalhes de seu funcionamento são os seguintes:
- o
ps fornece a lista de todos os processos.
- Os
grepfiltros que, com base na sua sequência de pesquisa, [p]são um truque para impedir que você pegue o valor realgrep processo .
- o
awk just fornece o segundo campo de cada linha, que é o PID.
- A
$(x)construção significa executar, em xseguida, pegue sua saída e coloque-a na linha de comando. A saída desse pspipeline dentro dessa construção acima é a lista de IDs de processo, então você termina com um comando como kill 1234 1122 7654.
Aqui está uma transcrição mostrando em ação:
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
e você pode vê-lo terminando todos os dormentes.
Explicando o grep '[p]ython csp_build.py' bit com mais detalhes:
Quando você sleep 3600 &segue ps -ef | grep sleep, você tende a ter dois processos sleepnele, o sleep 3600e o grep sleep(porque ambos têmsleep nele, isso não é ciência do foguete).
No entanto, ps -ef | grep '[s]leep'não criará um processo sleepnele, ele criará, grep '[s]leep'e aqui está a parte complicada: grepnão o encontra porque está procurando a expressão regular "qualquer caractere da classe de caractere [s](que é s) seguido por leep.
Em outras palavras, ele está procurando, sleepmas o processo grep é o grep '[s]leep'que não possui sleep.
Quando me mostraram isso (por alguém aqui no SO), imediatamente comecei a usá-lo porque
- é um processo a menos do que adicionar
| grep -v grep; e
- é elegante e sorrateira, uma combinação rara :-)