Como matar todo o processo com nome próprio?


16

Eu corro comando ps -A | grep <application_name>e obtendo lista de processos como este:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Eu quero matar todo o processo a partir da lista: 19440, 21630, 22694.

Eu tentei, ps -A | grep <application_name> | xargs kill -9 $1mas funciona com erros.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Como posso fazer isso normalmente?

Respostas:


25
pkill -f <application_na>

Matará todos os processos que contêm o padrão <application_na>em seus nomes.

homem pkill


9

O problema é que ps -A | grep <application_name> | xargs -n1retorna uma saída como esta

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Você pode usar awkpara obter primeiro uma coluna de pssaída .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Retornará a lista de PIDs

19440
21630
22694

E adicionando kill -9 $1você tem um comando que mata todos os PIDs

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1

isso é perfeito. Eu testo no script bash, mata o processador imediatamente, sem erros + mesmo que o processo não seja iniciado, ele não mostra erros, é o que eu quero, aqui exemplo do assassino do processador ffmpeg nano /usr/bin/ffmpegk ,. . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F

Eu tenho um problema com isso, onde eu recebo a saída kill -9se nenhum processo corresponder
Daniel F

1
Em vez de grep, você deve usar awkpara corresponder ao nome:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight

0

killall pode fazer isso.

$ killall application_name

O kill all permite a expressão regular no nome de um aplicativo?
D.ukasz Tulikowski 13/10/19

killall --regexp "appl.*me"Embora possa haver diferentes implementações de killall. Veja man killall.
Rudimeier 13/10/16

killall não é suficiente às vezes, eu preciso enviá-lo três vezes para interromper o processo e até falhar em matá-lo, a única solução rápida para mim é que kill -9 pideu acho que @ ŁukaszD.Tulikowski é a melhor solução de trabalho especialmente para scripts bash.
Salem F

-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh

Embora eu ainda não tenha votado nesta questão, você não descreveu por que isso é diferente ou melhor que as outras soluções - que são muito semelhantes a isso - ou descreveu por que o OP teve problemas com suas variações.
Jeff Schaller

-2

Minha abordagem é semelhante à @ Łukasz D. Tulikowski's. Em vez de usar grep <application_name>; Eu usei grep "[a]pplication_name", o que não corresponde à sua própria linha de comando do processo.

A expressão entre colchetes faz parte da grepcorrespondência de padrão de classe de caracteres. (Referência) .


Você pode usar awkpara obter primeiro uma coluna de pssaída.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Retornará a lista de PIDs

7644
407
406

Adicionando mais tarde kill -9 $1você tem um comando que mata todos os PIDs

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1

Por que ao grepinvés de usar awkpara fazer o teste mais corretamente? grepcorresponderá a nomes que incluem o destino como substring, por exemplo.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.