Como matar todos os processos com um determinado nome parcial? [fechadas]

623

Quero matar todos os processos que recebo:

ps aux | grep my_pattern

Como fazer isso?

Isso não funciona:

pkill my_pattern
Łukasz Lew
fonte
11
É my_patternsimplesmente uma substring do nome ou contém caracteres especiais de regex?
Sven Marnach

Respostas:

1318

Use pkill -f, que corresponde ao padrão para qualquer parte da linha de comandos

pkill -f my_pattern
Dor Shemer
fonte
7
@ Jayan: também é bastante indiscriminado em sua matança. É surpreendentemente fácil de mishandle ...
thkala
1
@ Jayan: você não vai me convencer :-). Fui queimado muitas vezes por scripts de terceiros que insistiam em usar pkill- o erro mais comum é a suposição de que apenas uma instância de cada binário poderia existir a qualquer momento.
Thkala
4
Para qualquer usuário de Mac que encontrar essa resposta, como eu, o equivalente é o Mac killall -m my_pattern.
Zev Eisenberg
1
Se você tiver vários processos suspensos que não são mortos, use pkill -f -9 para matá-los sem piedade.
MacK 16/16/16
18
Eu recomendo usar pgrepprimeiro para verificar o que você vai matar. Você pode usar pgrep -lpara ver nomes de processos ou pgrep -alinhas de comando completas. Ele usa os mesmos sinalizadores que pkill. Então, neste caso, você poderia usar pgrep -fa my_pattern.
Studgeek
158

Mate todos os processos correspondentes à sequência "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Fonte: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

O que esse código está fazendo?

O ps -efproduz uma lista de processo ID de no computador visível para este usuário. O grep de pipe filtra isso para linhas que contêm essa sequência. O grep -v grepditado não corresponde ao processo em si, fazendo o grepping. A impressão de pipe awk diz dividir as linhas no espaço em branco do delimitador padrão e filtrar para a segunda coluna, que é o nosso ID de processo. O pipe xargs inicia um novo processo para enviar todos esses documentos kill -9, terminando com todos eles.

O código acima é ruim, perigoso, feio e hackeado por várias razões.

  1. Se o código que está sendo finalizado forçando operações operacionais do banco de dados ou transações seguras com condições de baixa probabilidade de corrida, em uma fração de um por cento do tempo, a atomicidade dessa transação será destruída, produzindo um comportamento indefinido. matar -9 não leva prisioneiros. Se o seu código for sensível a isso, tente substituir a xargs killpeça por um sinalizador transmitido que solicite um desligamento normal e, somente se essa solicitação for negada, use o último recurso parakill -9

  2. Existe uma possibilidade diferente de zero de que você encerrará acidentalmente o sistema operacional ou causou um comportamento indefinido em um processo não relacionado, levando à instabilidade de todo o sistema, porque ps -eflista todos os processos possíveis que podem existir e você não pode ter certeza de que alguma biblioteca estranha de terceiros compartilha seu nome do processo, ou que, no período entre ler e executar kill -9, o processid mudou para outra coisa e agora você acidentalmente encerrou um processo aleatório que não pretendia.

Mas, se você entender os riscos e o controle deles com nomes muito exclusivos, e estiver bem com algumas transações descartadas ou corrupção ocasional nos dados, 99,9% das vezes você ficará bem. Se houver algum problema, reinicie o computador, verifique se não há colisões no processo. É por causa de um código como esse que faz do script de suporte técnico: "Você tentou reiniciar o computador" um meme de nível 5.

Eric Leschinski
fonte
15
Isso gerará um erro se nenhum processo correspondente ao nome for encontrado. Você pode querer usar ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9xargs para não executar o comando se nenhum argumento for fornecido.
Epigene 31/03
2
Apenas uma ligeira modificação, talvez seja melhor citar o nome do processo: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 sem aspas, apenas um dos meus processos em segundo plano foi morto na primeira execução. Executá-lo novamente matou o resto.
Ali Haider
-ropção não existe no OS X, ao que parece.
Danijel
52

Se você precisar de mais flexibilidade na seleção dos processos, use

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Você pode usar grep -e etc.

Eugen Rieck
fonte
4
-1 Você não precisa de um loop, apenas pode kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(observe também a refatoração; veja também o meu comentário na resposta do @ synthesizerpatel).
Tripleee
11
@tripleee Nenhum problema com a sua downvote, mas você fazer perceber, que o OQ foi "Eu quero matar todos os processos que eu recebo por: ps aux | grep my_pattern" , que eu dutyfully aceito.
Eugen Rieck
O Kill mata todos os processos de uma só vez, você não precisa de um loop para isso. Se o psretorno retornar três processos 123, 234 e 345, você poderá fazer o kill 123 234 345mesmo rmou catvários argumentos de arquivo.
Tripleee
@tripleee I ment remover ogrep
Eugen Rieck
for KILLPID in ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneremoverá o grep
Justin E
18

você pode usar o seguinte comando para listar o processo

ps aux | grep -c myProcessName 

se você precisar verificar a contagem desse processo, execute

ps aux | grep -c myProcessName |grep -v grep 

após o qual você pode matar o processo usando

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 
Nived Thanima
fonte
você pode usar o seguinte comando para listar o processo ps aux | grep -c myProcessName se você precisar verificar a contagem desse processo, execute ps aux | grep -c myProcessName | grep -v grep após o qual você pode matar o processo usando kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima
13

Também você pode usar killall -r my_pattern. -rInterprete o padrão do nome do processo como uma expressão regular estendida.

killall -r my_pattern
Alex
fonte
8

Se você julgar pkill -f PATTERNum pouco perigoso demais, escrevi ao ezkill um script bash que solicita que você escolha quais processos dentre aqueles que correspondem ao PADRÃO que você deseja matar.

kraymer
fonte
7

Você pode usar o seguinte comando para

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
Alex Liu
fonte
4

Se você não deseja ter dor de cabeça ao encontrar o ID do processo, use regexp para eliminar o processo pelo nome. Por exemplo, para matar o chrome, o seguinte código fará o truque.

killall -r --regexp chrome

ajaz
fonte
1
Você só precisa de um -r ou --regexp , que são as opções curta e longa GNU, respectivamente.
BigSmoke 10/01
3

Você pode usar o seguinte comando para:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

ou

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Funciona para mim.

Luis Lopes
fonte
1
Bem-vindo ao StackOverflow. Use recuo de 4 espaços ou tabulação para suas linhas de código, para que sejam formatadas como blocos de código. Atenciosamente
YakovL
2

Soa mal?

 pkill `pidof myprocess`

exemplo:

# kill all java processes
pkill `pidof java`
user6482587
fonte
2

Foi encontrada a melhor maneira de fazer isso para um servidor que não suporta pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

Você não precisa fazer um loop.

Magige Daniel
fonte
1

é melhor e mais seguro usar pgrep -fcom kill, ou apenas pkill -f, grepa pssaída de ing pode dar errado.

Ao contrário do uso ps | grepcom o qual você precisa filtrar a linha grep adicionando | grep -vou usando truques de padrão, pgrepsimplesmente não se escolhe por design.

Além disso, se seu padrão aparecer em ps's UID/ USER, SDATE/ STARTou em qualquer outra coluna, você obterá processos indesejados na saída e os matará, pgrep+ pkillnão sofrerá com essa falha.

também descobri que killall -r/ -regexp não funcionava com minha expressão regular.

pkill -f "^python3 path/to/my_script$"

man pkill

Wis
fonte
0

Peguei a resposta de Eugen Rieck e trabalhei com ela. Meu código adiciona o seguinte:

  1. ps ax inclui grep, então eu o excluí com grep -Eiv 'grep'
  2. Adicionados alguns ifs e ecos para torná-lo legível por humanos.

Eu criei um arquivo, chamado killserver, aqui vai:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Resultados

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything
Meir Gabay
fonte
0

Este é o caminho:

kill -9 $(pgrep -d' ' -f chrome)
MadMad666
fonte
3
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
Igor F.