Como matar todos os processos correspondentes a um nome?

260

Digamos que eu queira matar todos os processos que contenham a palavra amarok. Eu posso imprimir os comandos que quero executar. Mas como eu realmente faço o shell executá-los. ie

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031
PuercoPop
fonte
Adicionar | sh -xapós o restante da sua linha de comando?
Jonathan Leffler
7
nunca utilizar kill -9em um processo de ver [gestão de processos] [1] [1]: mywiki.wooledge.org/... ...
Fredrik Pihl
Adicionando ao comentário acima, não apenas a kill -9 é uma má idéia, mas também o fato de você estar tentando matar vários processos por meio do nome. Não há nada de exclusivo no nome de um processo e, portanto, é um candidato ruim para identificação.
precisa
Isso também matará o amarokxprocesso? Se pkill vi, mata o supervisorctlque contém `vi 'na palavra.
Gank 12/12
4
Esse artigo sobre não usar -9é inútil - existe alguma informação melhor sobre por que as pessoas não devem usá-lo? Apenas diz "não, e demitir pessoas que o usam"; mas tudo que eu já vi em qualquer outro lugar é que kill -9 {pid}é como matar alguma coisa ...
dwanderson

Respostas:

438

De man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

O que significa, por exemplo, se vemos essas linhas em ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Podemos matá-los todos usando a -fopção pkill :

pkill -f httpd
Tim Bielawa
fonte
1
Sei que isso não aborda o assunto desta pergunta, mas demonstra um método alternativo e mais curto de fazer o que você está tentando fazer.
precisa
19
Para força extra, adicione -9até o fim!
mlissner
Isso também matará o httpdxprocesso? Se pkill vi, mata o supervisorctlque contém `vi 'na palavra.
Gank 12/12/15
Impressionante - Ubuntu 18.04.1 LTS
Salathiel Genèse
Para correspondências sem distinção entre maiúsculas e minúsculas -i, use , como pkill -fi wine. Para verificar antes e depois, use ps uax | grep -i wine.
corvo vulcan
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - constrói listas de argumentos e executa o utilitário. Útil quando você quer tubulação em argumentos para algo como killou lsou assim por diante.

Nektarios
fonte
3
Pontos por mencionar o xargs - todo esse material do pgrep / pkill está muito bem, mas o xargs é uma ferramenta de uso geral e padrão em todos os linux / unix.
chrisdowney
4
"matar: não
existe
3
Cerin é porque está tentando matar o processo grep também, que já terminou. Deve ficar bem.
Costi Muraru
6
Há um pequeno truque para evitar a captura do processo grep: ps aux | grep -ie [a] marok | awk '{print $ 2}' | xargs kill -9
RCross
8
você também pode adicionar outra chamada grep para filtrar grep (eu acho isso mais fácil de ler / lembrar) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vsignifica grep --invert)
driftcatcher
47

usar pgrep

kill -9 $(pgrep amarok)
Eric Fortis
fonte
26
Até eleganter:pkill -9 amarok
glenn jackman
1
O pkill lida com a parte "todo processo que contém a palavra <palavra>" nativamente sem criar mais canais ou processos. Veja a opção -f para pesquisar o nome completo do processo para eliminar a necessidade do pgrep.
precisa
2
Cuidado que o pkill, por padrão, permite a correspondência parcial nos nomes dos processos. Este comando também mataria o amarok2 se ele existisse. Use -x ou -f se desejar especificar nomes exatos.
user79878
Ele falhará se o não são de partidas pelo pgrep
alfredocambera
para uso match Nome completokill -9 $(pgrep -f amarok)
cinatic
27

A maneira segura de fazer isso é:

pkill -f amarok
John Alexander Betts
fonte
1
Para adicionar a isso, adicionei a -lbandeira. Na verdade, eu apenas fiz um alias pkillpara pkill -flque eu possa executar algo como pkill jbosse isso cuspirá o processo que acabou de matar.
N10
Isso também matará o amarokxprocesso? Se pkill vi, mata o supervisorctlque contém `vi 'na palavra.
Gank 12/12/15
Como isso difere da resposta superior (de Tim)? Apenas corresponde ao nome do exemplo, caso contrário, parece idêntico? @ndland pkill: invalid option -- 'l'- pkill de procps-ng 3.3.12
Xen2050 25/10
18

Eu acho que esse comando killall é exatamente o que você precisa. O comando é descrito como "matar processos por nome". É fácil de usar. Por exemplo

killall chrome

Este comando irá matar todos os processos do Chrome. Aqui está um link sobre o comando killall

http://linux.about.com/library/cmd/blcmdl1_killall.htm

Espero que este comando possa ajudá-lo.

androidyue
fonte
Isso corresponde apenas ao nome, não à linha de comando completa. Definitivamente não é o mesmo que a busca ps auxda saída
Xen2050
12

pkill -x corresponde exatamente ao nome do processo.

pkill -x amarok

pkill -f é semelhante, mas permite um padrão de expressão regular.

Observe que o pkill sem outros parâmetros (por exemplo, -x, -f) permitirá correspondências parciais nos nomes dos processos. Então "pkill amarok" mataria amarok, amarokBanana, bananaamarok, etc.

Eu gostaria que -x fosse o comportamento padrão!

user79878
fonte
Isso também matará o amarokxprocesso? Se pkill vi, mata o supervisorctlque contém `vi 'na palavra.
Gank 12/12
@ Gank, sim, qualquer nome de processo com "amarok" em algum lugar.
user79878
Como matar apenas amarok em vez de amarokx?
Gank
1
@ Gank, bandeira -x. pkill -x amarok
user79878
4

Se você deseja executar a saída de um comando, é possível inseri-lo $(...), no entanto, para sua tarefa específica, dê uma olhada nos comandos killalle pkill.

Chen Levy
fonte
3

Você também pode avaliar sua saída como um subprocesso, envolvendo tudo com back ticks ou colocando-a dentro de $ ():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     
dandrews
fonte
3

tente kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Para matar processos de 11 de novembro ou kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Para matar processos que contenham a palavra amarok

Victor Marrerp
fonte
0

Talvez adicionando os comandos ao arquivo executável, definindo + x permissão e depois executando?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk
vova7865
fonte
-1

Se você estiver usando o cygwin ou algum shell mínimo que não killalltenha, basta usar este script:

killall.sh - mata pelo nome do processo.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Uso:

$ killall <process name>
Tony O'Hagan
fonte
Estou recebendokill: invalid argument f
rosstex
1
Tente substituir -f por -
Tony O'Hagan