Mate muitas instâncias de um processo em execução com um comando

59

Suponha que eu tenha mil ou mais instâncias de qualquer processo (por exemplo, vi ) em execução. Como eu mato todos eles em um único tiro / um comando de linha / um comando?

    
por The Dark Knight 11.10.2012 / 09:09

13 respostas

75

O que há de errado com o bom e velho,

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

Existem maneiras de tornar isso mais eficiente,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

e outras variações, mas no nível básico, sempre funcionou para mim.

    
por 11.10.2012 / 12:36
33

Use killall,

killall vi

Isto irá matar todo o comando chamado 'vi'

Você também pode adicionar um sinal, por exemplo, SIGKILL

killall -9 vi

    
por 11.10.2012 / 09:13
26

pkill é o que eu recomendo, se estiver disponível ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Você pode especificar processos pelo nome do comando, pela linha de comando completa ou por outros critérios. Por exemplo, pkill vi mata todos os programas cujo nome de comando contém a subcadeia vi . Para matar apenas processos chamados vi , use pkill -x vi . Para matar apenas processos chamados vi com um último argumento terminando em .conf , use pkill -fx 'vi.*\.conf' .

Para ver a lista de PIDs para os quais pkill enviaria um sinal, use pgrep , que tem exatamente a mesma sintaxe, exceto que não aceita um nome ou número de sinal. Para ver mais informações sobre esses processos, execute

ps -p "$(pgrep …)"

No Linux, você precisa de ps -p $(pgrep -d, …) (isso é um erro: o ps do Linux não é compatível com POSIX).

Outra maneira comum de identificar processos para matar são os processos que possuem um determinado arquivo aberto (que pode ser o executável do processo). Você pode listá-los com fuser ; use fuser -k para enviar um sinal. Por exemplo, fuser -k /usr/bin/find mata todas as isntâncias em execução de find .

Se houver um processo de fuga que mantenha a bifurcação, talvez seja necessário eliminar todo o grupo de processos de uma só vez. Um grupo de processos é identificado pelo negativo de seu líder, que é o processo ancestral de todos os processos do grupo. Para ver o grupo de processos ao qual um processo pertence, execute ps -o pgid (mais qualquer opção para selecionar quais processos exibir). Se você determinar que deseja eliminar o líder do grupo de processos 1234 e todos os seus filhos, execute kill -1234 ou kill -HUP -1234 ou qualquer outro sinal.

Se você não conseguir encontrar uma maneira melhor, use ps com as opções adequadas para listar todos os processos e filtrá-lo com grep ou algum outro comando de filtragem de texto. Tome cuidado para não corresponder acidentalmente a outros processos que estejam executando um comando com um nome semelhante ou com um argumento que contenha esse nome. Por exemplo:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

Lembre-se de que o comando grep ou awk pode estar listado na ps output ( ps e o comando de filtragem é iniciado em paralelo, portanto, se ele será exibido ou não depende da sincronização) . Isso é particularmente importante se os argumentos do comando estiverem incluídos na saída ps .

    
por 15.10.2012 / 01:34
6

pkill é muito bom aqui. Você pode fornecer muitos parâmetros para refinar o padrão.

    
por 11.10.2012 / 21:21
4

A maneira mais fácil de fazer é verificar primeiro se você está obtendo os IDs corretos do processo com:

pgrep -f [part_of_a_command]

Se o resultado for o esperado. Vá com:

pkill -f [part_of_a_command]
    
por 12.07.2016 / 21:52
2

Interessante, ninguém mencionou este aqui. O pidof gera pids separados por espaço de processos que correspondem ao nome do processo passado. Como tal, você pode usar diretamente sua saída com kill sem tubulação. No Arch Linux eu uso

kill -9 $(pidof <proc name>)

A desvantagem desta solução é que ela não permite o uso de expressões regulares.

    
por 19.05.2016 / 16:22
0

Eu sugiro que você tente pkill .

Ex: ps -ef | pkill -f command

Para mostrar a lista de todos os processos a serem mortos, primeiro tente pgrep :

Ex: ps -ef | pgrep -f command

    
por 02.01.2013 / 13:00
0

pgrep "name-of-application" | xargs kill -9

Era simples o suficiente para lembrar e funcionou bem para mim.

    
por 16.04.2016 / 19:52
0

Você pode matar vários processos diferentes usando o comando abaixo

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

Observe que isso eliminará o processo que corresponde ao padrão acima, o que significa que process1abc process2def process3ghi também será eliminado.

    
por 03.07.2018 / 06:15
-2

Por que você não tenta:

kill -9 vi*
    
por 11.10.2012 / 11:47
-2
$ ps -eaf  | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
    
por 15.04.2015 / 08:01
-2
ps -ef | pgrep -f "search" | xargs kill -9  
    
por 30.08.2016 / 11:49
-2
ps -ef | pgrep -f "search" | xargs kill -9 

este comando funcionou perfeito para mim.

    
por 25.01.2017 / 13:23

Tags