Quero matar todos os processos que recebo:
ps aux | grep my_pattern
Como fazer isso?
Isso não funciona:
pkill my_pattern
Quero matar todos os processos que recebo:
ps aux | grep my_pattern
Como fazer isso?
Isso não funciona:
pkill my_pattern
Respostas:
Use pkill -f
, que corresponde ao padrão para qualquer parte da linha de comandos
pkill -f my_pattern
pkill
- o erro mais comum é a suposição de que apenas uma instância de cada binário poderia existir a qualquer momento.
killall -m my_pattern
.
pgrep
primeiro para verificar o que você vai matar. Você pode usar pgrep -l
para ver nomes de processos ou pgrep -a
linhas de comando completas. Ele usa os mesmos sinalizadores que pkill. Então, neste caso, você poderia usar pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
O que esse código está fazendo?
O ps -ef
produz 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 grep
ditado 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.
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 kill
peça por um sinalizador transmitido que solicite um desligamento normal e, somente se essa solicitação for negada, use o último recurso parakill -9
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 -ef
lista 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.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
xargs para não executar o comando se nenhum argumento for fornecido.
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.
-r
opção não existe no OS X, ao que parece.
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.
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).
ps
retorno retornar três processos 123, 234 e 345, você poderá fazer o kill 123 234 345
mesmo rm
ou cat
vários argumentos de arquivo.
grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
removerá o grep
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 }')
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
-r
ou --regexp
, que são as opções curta e longa GNU, respectivamente.
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.
Soa mal?
pkill `pidof myprocess`
exemplo:
# kill all java processes
pkill `pidof java`
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.
é melhor e mais seguro usar pgrep -f
com kill
, ou apenas pkill -f
, grep
a ps
saída de ing pode dar errado.
Ao contrário do uso ps | grep
com o qual você precisa filtrar a linha grep adicionando | grep -v
ou usando truques de padrão, pgrep
simplesmente não se escolhe por design.
Além disso, se seu padrão aparecer em ps
's UID
/ USER
, SDATE
/ START
ou em qualquer outra coluna, você obterá processos indesejados na saída e os matará, pgrep
+ pkill
nã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$"
Peguei a resposta de Eugen Rieck e trabalhei com ela. Meu código adiciona o seguinte:
ps ax
inclui grep, então eu o excluí com grep -Eiv 'grep'
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
my_pattern
simplesmente uma substring do nome ou contém caracteres especiais de regex?