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.