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 $pidprimeiro, 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 vimata 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 vicom um último argumento terminado em .conf, use pkill -fx 'vi.*\.conf'.
Para ver a lista de PIDs que pkillenviariam 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 psnã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 -kpara enviar um sinal a eles. Por exemplo, fuser -k /usr/bin/findmata 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 -1234ou kill -HUP -1234ou qualquer outro sinal.
Se você não encontrar uma maneira melhor, use psas opções adequadas para listar todos os processos e filtrá-lo com grepou 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 grepou awkpode estar listado na pssaída ( pse 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 pssaída.
pkillé muito legal aqui. Você pode fornecer muitos parâmetros para refinar o padrão.
pkillestá 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 killsem 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 -efpara pkillou 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
pkilldoprocpspacote.