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.

Atiq
fonte
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á

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

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

heemail
fonte
+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.

Chetan Narsude
fonte
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Ankur Kumar
fonte
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