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>)


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

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.


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

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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.