@ 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":
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.
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
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.
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
-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
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.
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.
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.
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
é 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.
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.
my_pattern
simplesmente uma substring do nome ou contém caracteres especiais de regex?Respostas:
Use
pkill -f
, que corresponde ao padrão para qualquer parte da linha de comandosfonte
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 usarpgrep -l
para ver nomes de processos oupgrep -a
linhas de comando completas. Ele usa os mesmos sinalizadores que pkill. Então, neste caso, você poderia usarpgrep -fa my_pattern
.Mate todos os processos correspondentes à sequência "myProcessName":
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 -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. Ogrep -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 documentoskill -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.
fonte
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
Você pode usar grep -e etc.
fonte
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 okill 123 234 345
mesmorm
oucat
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 grepvocê pode usar o seguinte comando para listar o processo
se você precisar verificar a contagem desse processo, execute
após o qual você pode matar o processo usando
fonte
Também você pode usar
killall -r my_pattern
.-r
Interprete o padrão do nome do processo como uma expressão regular estendida.fonte
Se você julgar
pkill -f PATTERN
um 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.fonte
Você pode usar o seguinte comando para
fonte
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
fonte
-r
ou--regexp
, que são as opções curta e longa GNU, respectivamente.Você pode usar o seguinte comando para:
ou
Funciona para mim.
fonte
Soa mal?
exemplo:
fonte
Foi encontrada a melhor maneira de fazer isso para um servidor que não suporta
pkill
Você não precisa fazer um loop.
fonte
é melhor e mais seguro usar
pgrep -f
comkill
, ou apenaspkill -f
,grep
aps
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
'sUID
/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$"
man pkill
fonte
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í comgrep -Eiv 'grep'
Eu criei um arquivo, chamado
killserver
, aqui vai:Resultados
fonte
Este é o caminho:
fonte