2010-09-12 31 views
5

Tengo un .exe externo de Windows que en realidad es una aplicación Java: al ejecutar el .exe se inicia javaw.exe, que a su vez ejecuta esa aplicación Java.Cómo matar el proceso de Java en Windows, SIN matar a javaw.exe?

No escribí esa aplicación y no tengo acceso a ella a través de una API. Sin embargo, necesito poder matarlo. Así que en este momento simplemente elimino el proceso de Windows javaw.exe, que está bien para una máquina de prueba que solo ejecuta esa aplicación Java, pero si necesito una granularidad más fina, actualmente no puedo hacerlo.

Mis búsquedas arrojaron sugerencias como Sysinternal's Process Explorer o el comando jps en el JDK, pero en los sistemas de destino para los que pretendo proporcionar el script, ni JDK ni Sysinternal's Process Explorer se pueden ejecutar.

¿Hay alguna otra manera que no requiera una herramienta externa? ¿Javaw.exe tiene un interruptor o una opción de línea de comando que enumera los procesos de Java? ¿Hay una versión JRE de jps?

Gracias.

Respuesta

3

Aún sugiero que se mate al javaw.exe.

No puedo ver el lado negativo, ya que es el proceso que desea matar después de todo.

Recuerde que si ejecuta varias aplicaciones en la máquina, cada una de ellas debe tener una instancia de JVM por separado. Por lo tanto, aún puede matar la aplicación específica si es necesario.

+0

Gracias a ambos, Jim y @mikera - +1 por los dos por explicarme este problema. ¿Cómo sabría * qué * javaw.exe matar? –

+1

¿No puedes mirar la pestaña Aplicaciones del Administrador de tareas, luego hacer clic derecho en el programa correspondiente y presionar Ir al proceso. Eso te dará el javaw.exe correcto. –

+3

Lo que necesita es una herramienta como Sysinternals Process Explorer. Le permitirá ver los procesos principales y mostrarle la línea de comando completa pasada a javaw.exe. –

2

Si desea eliminar una JVM completa, simplemente elimine el proceso javaw.exe. Dentro de una JVM puede haber múltiples Java hilos pero no hay forma de meterse en una JVM y terminar un hilo a menos que el desarrollador de la aplicación haya proporcionado un método para hacerlo.

1

En función de su comentario, se están ejecutando múltiples programas javaw.exe y necesita saber cuál matar.

Puede intentar conectarse a cada uno de los procesos con JConsole e inspeccionar la JVM. Puede haber suficientes pistas para determinar cuál matar. Una vez que haya identificado el perfil de su aplicación, debería ser capaz de crear una secuencia de comandos de la lógica para que sea más fácil en el futuro (use JMX para obtener la mayor parte de la información provista por JConsole).

3

El JDK (y posiblemente el JRE) se envía con una utilidad llamada jps que puede enumerar todos los procesos de Java pero también indicarle la clase principal que se ejecuta actualmente en esa JVM. Si JMX/JConsole no es una opción, simplemente analizar la salida de "jps -ml" y matar el proceso apropiado puede funcionar.

0

Si el ejecutable inicia javaw y sale sin proporcionar más información, parece que necesita utilizar su lenguaje de scripts para tomar una instantánea de los procesos en ejecución en la máquina antes de ejecutar el ejecutable y después de que el ejecutable haya finalizado. Entonces podrás deducir cuál es el nuevo proceso javaw. ¿Qué lenguaje de scripting estás usando?

0

Solo otro enfoque: si tiene el jdk, hay un programa llamado jvisualVM en la carpeta bin. Tiene buena información sobre cada contexto de JVM en ejecución. Una de las cosas que puede ver es el PID de la máquina virtual, que utilizo para eliminar el proceso en Windows usando el administrador de tareas (en Windows PID no se muestra de manera predeterminada, pero puede habilitar la columna fácilmente al acceder a ver -> mostrar columnas)

Cuestiones relacionadas