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
.