Cómo matar todos los procesos aparte del específico

13

En mi servidor local, se están ejecutando muchos procesos de Java, y al mismo tiempo estoy usando Eclipse. Ahora, cuando necesito reiniciar mis procesos (inicio procesos a través de un script de shell), antes de cada inicio, necesito eliminar los procesos antiguos a través de:

Método 1: - kill -9 $Pid (para cada proceso, uno por uno, lo que lleva mucho tiempo)

Método 2: - killall -9 java(para todos los procesos: fácil, pero Eclipse se eliminará de forma innecesaria)

En el caso del Método 2, Eclipse también será asesinado, lo que nunca quiero. ¿Hay alguna forma de salir de esto? Apuesto a que debe haber: P

Editar: estoy usando ubuntu 15.04.

Atiq
fuente
estás usando openjdk?
Maythux
no, es java-7-oracle
Atiq
revisa mi respuesta
Maythux

Respuestas:

17

Prueba este comando:

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

esto buscará todos los procesos que contengan Java y excluya el eclipse y luego los matará

Maythux
fuente
3
++ 1 por no usar -9indiscriminadamente. Deberías darle a un proceso la oportunidad de salir con gracia.
Rmano
pgrepes mejor que de ps | greplo contrario te arriesgas a matar la declaración grep en sí.
Abligh
2
@abligh El problema es pgrepque no puede distinguir qué procesos están ejecutando eclipse, porque incluso pgrep -lsolo informará java. @ Maythux, solo como referencia, egrepestá en desuso y no debe usarse, ya que grep -Ehace exactamente lo mismo, aunque ni siquiera lo necesita grep -Eya que está haciendo coincidir una cadena fija; por lo que sólo grep -v "eclipse"(o si se quiere ser de lujo [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos
@kos: no probado: pkill '/java\(.*eclipse\)\@!'
abligh
@abligh ¿Qué es \@!? Si eso es un Perl-ismo, no funcionará, ya que pkillsolo admite ERE, he intentado reducir toda esta tarea a un solo comando que ya se usa pkillcon miradas negativas y que falló por esta razón.
kos
12

Utilizando awk

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

El comando mata todos los javaprocesos, pero no el proceso eclipse.

AB
fuente
3
Más elegante (y más rápido) que la respuesta de @maythux en mi humilde opinión ... ;-)
Fabby
Estoy de acuerdo con Fabby, ¡bien!
kos
1

Qué tal si :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'busca javaen la línea de comando completa de los procesos y los enumera

  • grep -Po '^[^ ]+(?!.*eclipse)'busca entre los procesos buscados y obtiene los ID de proceso de los procesos que no tienen eclipseen sus líneas de comando completas

  • xargs kill matará los procesos.

heemayl
fuente
+1 para una solución corta y elegante. Tenga en cuenta que habría sido posible tener una pkillsolución aún más eficiente (solo un comando pgrep/pkill:) si se admitiera perl regex'es que utiliza en el segundo paso anterior. Desafortunadamente pgrep/ pkillsolo admite expresiones regulares extendidas (como egrep/grep -E).
arielf
@arielf Tienes toda la razón ... hubiera sido más eficiente si pgrep/ pkillapoya PCRE ..
heemayl
0

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

Use jps para asegurarse de que está buscando solo los comandos de Java y no todos los comandos que tienen Java en su camino.

Chetan Narsude
fuente
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Ankur Kumar
fuente
1
Hubiera sido mejor explicar los comandos, en lugar de dar una cadena de comandos críptica. Además, ¿qué pasa con mi comando de larga duración "orkjavagoob.sh"
waltinator