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.


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á


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.


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.


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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.