Como matar todos os processos além do específico


13

No meu servidor local, muitos processos java estão em execução e, ao mesmo tempo, estou usando o Eclipse. Agora, quando preciso reiniciar meus processos (inicio processos por meio de um script de shell), antes de cada início, preciso eliminar os processos antigos por meio de:

Método 1: - kill -9 $Pid (para cada processo, um por um, que consome tempo)

Método 2: - killall -9 java(para todos os processos - fácil, mas o Eclipse será eliminado desnecessariamente)

No caso do método 2, o Eclipse também será morto, o que eu nunca quero. Existe alguma maneira de sair disso? Aposto que deve haver: P

Edit: eu estou usando o ubuntu 15.04.


você está usando o openjdk?
Maythux 24/07/2015

não é java-7-oráculo
Atiq

verifique a minha resposta #
Maythux

Respostas:


17

Tente este comando:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

isso procurará por todos os processos que contenham java e eclipse execluso e depois os matará


3
++ 1 por não usar -9indiscriminadamente. Você deve sempre dar a um processo a chance de sair normalmente.
Rmano 24/07

pgrepé melhor do ps | grepque você corre o risco de matar a própria declaração grep.
abligh

2
@abligh O problema é que pgrepvocê não é capaz de distinguir quais processos estão executando o eclipse, porque até pgrep -lo relatório será apenas java. @ Maythux, apenas para referência, egrepestá obsoleto e não deve ser usado, pois grep -Efaz exatamente o mesmo, embora você nem precise, grep -Epois está combinando uma string fixa; por isso só grep -v "eclipse"(ou se você quiser ser chique [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos

@kos: untested:pkill '/java\(.*eclipse\)\@!'
abligh

@abligh O que é \@!? Se esse é um Perl-ism, não vai funcionar, porque pkillsuporta apenas EREs, tentei reduzir toda essa tarefa a um único comando já usado pkillcom lookaheads negativos e que falhou por esse motivo.
kos

12

Usando awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

O comando mata todos os javaprocessos, mas não o processo eclipse.


3
Mais elegante (e mais rápido), então a resposta de @maythux IMHO ... ;-)
Fabby

Eu concordo com Fabby, legal!
kos 24/07

1

E se :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'procura javana linha de comando completa dos processos e lista-os

  • grep -Po '^[^ ]+(?!.*eclipse)'procura entre os processos pesquisados ​​e obtém os IDs dos processos que não possuem eclipseem suas linhas de comando completas

  • xargs kill matará os processos.


+1 para uma solução curta e elegante. Observe que teria sido possível ter uma pkillsolução ainda mais eficiente (apenas um comando pgrep/pkill:) se suportada pelo perl regex'es que você usa na 2ª etapa acima. Infelizmente pgrep/ pkillapenas suporta regexps estendidos (como egrep/grep -E).
Arielf 24/07

@arielf Você está absolutamente right..it teria sido mais eficiente se pgrep/ pkillsuportes PCRE ..
heemayl

0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

Use jps para garantir que você esteja procurando apenas os comandos java e não todos os comandos que possuem java no caminho.


0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

1
Teria sido melhor explicar os comandos, em vez de apenas fornecer uma cadeia de comandos enigmática. Além disso, o que acontece com o meu comando de longa duração "orkjavagoob.sh"
waltinator
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.