Como dar argumentos para matar via pipe


85

Preciso pesquisar um determinado processo e eliminar esse processo. Escrevi um comando como este:

ps -e | grep dmn | awk '{print $1}' | kill

Onde está o nome do processo dmn. Mas isto não está funcionando. Como posso encontrar processos por nome e por killeles.

Respostas:


162
kill $(ps -e | grep dmn | awk '{print $1}')

8
Use o mais recente $()sintaxe: kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D

7
Para outros, tive de modificar esta resposta para fazê-la funcionar: kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')não tenho certeza por que e não me importo o suficiente para examinar mais a fundo.
joshweir de

1
@joshweir É porque de outra forma killtentou matar até mesmo o processo 'grep' que estava tentando pesquisar o padrão
meain de

Não seria necessário \napós cada awk, como em awk '{print $1"\n"}'?
Sopalajo de Arrierez de

45

Caso haja vários processos que você deseja remover, você pode usar isto:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

Nota: Você precisa remover o próprio processo grep da saída, é por isso que grep -v grepé usado.


17
Você pode evitar que o grep apareça em seu grep colocando o primeiro caractere entre colchetes, como: grep [d] mn
Oldskool

1
@Oldskool Belo truque. Usar metacaracteres para fazer a expressão regular grep não corresponder a si mesma é uma boa ideia.
jcollado

@Oldskool, +1, você é um gênio!
JCR

Belo truque, embora torne mais complicado transformá-lo em um script de shell
Metagrapher

17

Você poderia usar

pkill dmn 

se o seu sistema tiver o comando pkill .


1
+1 para pkill em vez de killall. Está disponível em várias plataformas sem "significado" diferente ( killall no Solaris é equivalente a killall5 no Linux, por exemplo - isto é, matar TODOS os processos)
plundra

4

Apenas adicionando outros, mas gosto de usar a capacidade dos recursos regex do awk:

kill $(ps | awk '/dmn/{print $1}')

4

Se você tiver o pidofcomando em seu sistema (eu sei que shells como ZSH vêm com isso por padrão, a menos que esteja enganado), você poderia fazer algo parecido.

kill -9 $(pidof dmn)


2

Talvez você não precise pipedisso, se você tem o pidofcomando e sabe o nome da imagem, eu fiz assim:

kill $(pidof synergyc)

$()Eu entendo isso, pois ele converte a saída em uma variável que pode usar kill, essencialmente como o pipe faria. Mais curto e mais fácil de entender do que algumas outras opções, mas também pode ser menos flexível e mais direto.


0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

Olá amigos .. podemos fazer isso usando for loop.

"Alguma pesquisa" é aqui qualquer nome de processo que você deseja pesquisar, por exemplo "java", portanto, digamos que a contagem de processos java é 200+, então matar um por um será muito comum.

então você pode usar o comando acima.

Obrigado.


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.