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 / comando de uma linha / comando?
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 / comando de uma linha / comando?
Respostas:
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.
echo kill -9 $pid
primeiro, de qualquer maneira, para saber o que estou recebendo. Não sei se o AIX possui pkill
, que é meu UNIX de pão com manteiga. E é realmente ruim o suficiente para ser rebaixado - estranho.
csh
Use killall,
killall vi
Isso matará todo comando chamado 'vi'
Você também pode adicionar um sinal, por exemplo, SIGKILL
killall -9 vi
killall -9 vi
killall
, exatamente o que o nome sugere ... ele mata o processo de inicialização.
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 substring vi
. Para matar apenas os processos chamados vi
, use pkill -x vi
. Para matar apenas processos chamados vi
com um último argumento terminado em .conf
, use pkill -fx 'vi.*\.conf'
.
Para ver a lista de PIDs que pkill
enviariam um sinal para use pgrep
, que possui 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 ps -p $(pgrep -d, …)
(isso é um bug: o Linux ps
não é compatível com POSIX).
Outra maneira comum de identificar processos a serem eliminados são os processos que têm um determinado arquivo aberto (que pode ser o executável do processo). Você pode listá-las com fuser
; use fuser -k
para enviar um sinal a eles. Por exemplo, fuser -k /usr/bin/find
mata todas as isntances em execução de find
.
Se houver um processo descontrolado que continua bifurcando, pode ser necessário matar o grupo de processos inteiro de uma só vez. Um grupo de processos é identificado pelo negativo de seu líder, que é o processo ancestral de todos os processos no 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 matar 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 encontrar uma maneira melhor, use ps
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 coincidir acidentalmente com 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 seu comando grep
ou awk
pode estar listado na ps
saída ( ps
e o comando de filtragem é iniciado em paralelo, portanto, se ele será exibido ou não, depende do tempo). Isso é particularmente importante se os argumentos do comando estiverem incluídos na ps
saída.
pkill
é muito legal aqui. Você pode fornecer muitos parâmetros para refinar o padrão.
pkill
está disponível no Linux, BSD e Solaris - afaik. Portanto, tem uma propagação maior que killall
.
A maneira mais fácil de fazer isso é verificar primeiro se você está obtendo os IDs de processo corretos com:
pgrep -f [part_of_a_command]
Se o resultado for o esperado. Ir com:
pkill -f [part_of_a_command]
pgrep -f "command name"
Interessante ninguém mencionou este. 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 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.
Eu sugiro que você tente pkill
.
Ex: ps -ef | pkill -f command
Para mostrar a lista de todos os processos a serem eliminados, primeiro tente pgrep
:
Ex: ps -ef | pgrep -f command
ps -ef
para pkill
ou pgrep
? Esses comandos não são lidos da entrada padrão.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
doprocps
pacote.