2010-01-25 18 views
11

¿Existe una manera de detener un programa Java se ejecuta utilizando un script de shell conociendo los nombres de alone.I estoy usando shell kshShell script para detener un programa java

+1

Saber qué nombre? Si conoce el nombre del ejecutable (que normalmente es 'java'),' killall' es su amigo. – sfussenegger

+0

@sfussenegger: Probablemente él no quiere matar a todos los procesos de java, pero solo uno específico. – Mnementh

+0

@Mnementh eso es lo que esperaría también, pero a partir de la información dada, esto es lo mejor que podría recomendar. – sfussenegger

Respuesta

6

Agregue una propiedad única a la JVM para identificarla fácilmente, p. para Test.class

java -Duniquename=1 test 

para matarlo:

ps ax | grep uniquename | grep -v grep | awk '{print $1}' | xargs kill 
+0

Su error de lanzamiento. Estoy usando ksh shell – Harish

+0

¿Qué error está obteniendo? –

+0

Funciona bien bajo KSH. Tal vez ha cometido un error al copiar el comando. – diciu

1

Puede utilizar pkill:

pkill your_java_program_name 

Esto funcionaría si ejecuta solo una instancia de su programa en ejecución.

3

Puede usar jps identificando el id de proceso asociado con el nombre del programa java iniciado (jps es un gestor de proceso para los programas java). Con esta identificación, puedes matar el proceso normalmente.

+0

asumiendo que mi nombre de archivo java es test.java y se está ejecutando cómo encontrarlo? – Harish

+0

+1 por presentarme a jps :) – sfussenegger

+0

@Harish: después de compilarlo y ejecutarlo se mostrará como 'prueba'. Si lo empaqueta en un archivo ejecutable (test.jar) y lo ejecuta a través de 'java -jar test.jar', jps muestra 'test.jar'. – Mnementh

20

seguimiento de Mnementh' suggestion:

esto debe hacer el trabajo

jps -l | grep org.example.MyMain | cut -d ' ' -f 1 | xargs -rn1 kill 
  • jps -l: Lista de java Pro con "nombre completo del paquete para la clase principal de la aplicación o el nombre completo de la ruta al archivo JAR de la aplicación".

  • grep: elegir el proceso te gusta

  • cut -d -' ' -f 1: dividir la salida en columnas utilizando delimitador '' e imprimir sólo la primera (PID)

  • xargs -rn1 kill: ejecución de interrupción para cada PID (si lo hay)

nota que debe ejecutar JPS y xargs con el mismo usuario (o raíz) que se está ejecutando el proceso de

+1

+1 por cada' wow 'que dije en cada línea.:) – Nishant

+1

Esto también funcionará para las máquinas de Windows, pero vas a necesitar hacer un poco de detección de entorno para descubrir qué 'matar' usar. –

+0

@Odelya Acabo de agregar '-r' (' --no-run-if-empty') a 'xargs' para evitar este error. – sfussenegger

1

puede utilizar la opción -o de PS para dar formato a la salida,

ps -eo cmd,pid | awk '!/awk/&&/mycommand/{cmd="kill -9 "$2;system(cmd)}' 
Cuestiones relacionadas