Como matar vários processos

21

para encontrar o PID do processo para eliminar o uso:

pgrep <process command>

Eu então uso o comando kill para matar o PID retornado por pgrep <process command>

kill <PID>

Esses comandos podem ser combinados em um só para matar o PID ou o PID retornado pgrep <process command>? Ou existe um método para matar vários processos pelo nome do comando?

Algo como : kill(pgrep <name of process>)

céu azul
fonte
3
Você tentou pkill? Como alternativa, você pode querer usar xargs.
MatthewRock
11
Observe que as páginas de manual também são boas para coisas como esta. Freqüentemente, eles não apenas informam como usar o comando, mas também falam sobre comandos relacionados. Nesse caso, a pgreppágina de manual menciona pkilltodo o local (como os 2 comandos vêm do mesmo pacote).
Patrick

Respostas:

27

Você pode usar o pkill:

pkill httpd

Você também pode usar a substituição de processo (embora isso não seja tão claro):

kill $(pgrep command)

E você pode querer usar xargs:

pgrep command | xargs kill
MatthewRock
fonte
4
Fiz uma coisa semelhante em uma resposta e me foi indicado que introduzi uma condição de corrida. Os IDs do processo podem ser invalidados entre as chamadas para pgrepe kill. Apenas use pkill.
Kusalananda
3
@Kusalananda também pode acontecer a mesma coisa entre pkillobter a lista de processos e enviar o sinal, é mais difícil ver nesse caso.
Hbbs
11
Eu estava tentando escrever uma resposta que kill $(ps|head -1)contornasse algo como evitar a condição de corrida ... mas realmente não há uma maneira de evitá-la. O processo pode morrer em qualquer ponto do pipeline.
Ross Presser
Apenas tome cuidado com o pkill porque alguns programas podem ter mais de uma instância em execução e você pode não querer matar todos eles. Executar o pgrep primeiro ajudará, desde que outro não comece entre o tempo em que você executa o pgrep e o pkill (corrida).
21716 Joe
11
Mesmo um programa em C não pode evitar a condição de corrida, a janela será menor. A única maneira de fazê-lo verdadeiramente atomicamente seria adicionar uma chamada do sistema que mata processos pelo nome. Mas os IDs de processo geralmente não serão reutilizados muito rapidamente, portanto, o perigo é praticamente inexistente.
Barmar
17

Você também pode usar killall, por exemplo

killall firefox

para enviar SIGTERMpara todos os firefoxprocessos.

Byte Commander
fonte
8
Observe que killalltem significados diferentes em sistemas unix diferentes - se você estiver em um sistema não Linux, verifique a documentação.
Random832
killall -KILL firefoxpode se sentir tão gratificante.
pipe
A não portabilidade killallé por isso que nunca a uso. Correr killallem uma caixa solaris, por exemplo, é desastroso.
21416 Patrick
9

Sim, você pode usar um recurso bash e fazer um loop sobre a saída.

$ for proc in $(pgrep <process command>); do kill $proc; done
lcipriani
fonte
Eu recebokill <no>:failed: operation not permitted
Timo
Provavelmente você não tem as permissões corretas ou o processo não existe mais, consulte: superuser.com/questions/1175485/…
lcipriani
0

Você pode matar vários processos com matriz. Neste caso, você pode especificar opções como $ip, $hostnameou algo similar.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
Vladyslav Greyswandir
fonte