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
grep
filtros 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 x
seguida, pegue sua saída e coloque-a na linha de comando. A saída desse ps
pipeline 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 sleep
nele, o sleep 3600
e 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 sleep
nele, ele criará, grep '[s]leep'
e aqui está a parte complicada: grep
nã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, sleep
mas 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 :-)