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.

usuário567879
fonte

Respostas:

162
kill $(ps -e | grep dmn | awk '{print $1}')
Daniel Persson
fonte
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.

Jcollado
fonte
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 .

unutbu
fonte
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}')
pedmiston
fonte
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)
Nathan F.
fonte
2

Você também pode usar killall :

killall dmn
Esqui
fonte
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.

NotVeryPythonic
fonte
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.

Nishant
fonte
0

Use pgrepcom a opção -f. kill $(pgrep -f dmn)

Deepak Sharma
fonte
4
Se sim pgrep, por que não apenas pkill -f dmn?
muru 01 de