example ejemplo java process

example - process java ejemplo



Matar un proceso usando Java (7)

AFAIU java.lang.Process es el proceso creado por java en sí (como Runtime.exec (''firefox''))

Puede usar comandos dependientes del sistema como

Runtime rt = Runtime.getRuntime(); if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) rt.exec("taskkill " +....); else rt.exec("kill -9 " +....);

Me gustaría saber cómo "matar" un proceso que se ha iniciado. Soy consciente de la API de proceso, pero no estoy seguro, si puedo usar eso para "matar" un proceso ya en ejecución, como firefox.exe, etc. Si se puede usar la API de proceso, ¿puede indicarme el dirección correcta? Si no, ¿cuáles son las otras opciones disponibles? Gracias.


Accidentalmente me encontré con otra forma de matar a la fuerza en Unix (para aquellos que usan Weblogic). Esto es más barato y más elegante que ejecutar / bin / kill -9 a través de Runtime.exec () .

import weblogic.nodemanager.util.Platform; import weblogic.nodemanager.util.ProcessControl; ... ProcessControl pctl = Platform.getProcessControl(); pctl.killProcess(pid);

Y si lucha por obtener el pid, puede usar la reflexión en java.lang.UNIXProcess , por ejemplo:

Process proc = Runtime.getRuntime().exec(cmdarray, envp); if (proc instanceof UNIXProcess) { Field f = proc.getClass().getDeclaredField("pid"); f.setAccessible(true); int pid = f.get(proc); }


En Windows probablemente tengas que usar este comando

taskkill /F /IM <processname>.exe

matarlo con fuerza Así será

Runtime.getRuntime().exec("taskkill /F /IM <processname>.exe")


Intentalo:

String command = "killall <your_proccess>"; Process p = Runtime.getRuntime().exec(command); p.destroy();

si el proceso aún está activo, agregue:

p.destroyForcibly();


Puede matar a (SIGTERM) un proceso de Windows que se inició desde Java llamando al método destroy en el objeto Process. También puede matar cualquier proceso hijo (desde Java 9).

El siguiente código inicia un archivo por lotes, espera diez segundos y luego mata todos los subprocesos y finalmente mata el proceso por lotes.

ProcessBuilder pb = new ProcessBuilder("cmd /c my_script.bat")); Process p = pb.start(); p.waitFor(10, TimeUnit.SECONDS); p.descendants().forEach(ph -> { ph.destroy(); }); p.destroy();


Puede ser un defecto del intérprete de Java, pero java en HPUX no hace un kill -9, sino solo un kill -TERM.

Hice una pequeña prueba de prueba Destroy.java:

ProcessBuilder pb = new ProcessBuilder(args); Process process = pb.start(); Thread.sleep(1000); process.destroy(); process.waitFor();

Y la invocación:

$ tusc -f -p -s signal,kill -e /opt/java1.5/bin/java testDestroy sh -c ''trap "echo TERM" TERM; sleep 10''

muere después de 10 s (no se mata después de 1 s como se esperaba) y muestra:

... [19999] Received signal 15, SIGTERM, in waitpid(), [caught], no siginfo [19998] kill(19999, SIGTERM) ............................................................................. = 0 ...

Hacer lo mismo en Windows parece matar el proceso bien incluso si se maneja la señal (pero eso puede deberse a que Windows no usa señales para destruir).

De hecho, encontré que Java: el código fuente de Process.destroy () para el hilo relacionado con Linux y la implementación de openjava también parece que usa -TERM, lo cual parece muy incorrecto.


Si inicia el proceso desde dentro en su aplicación Java (por ejemplo, llamando a Runtime.exec() o ProcessBuilder.start() ), entonces tiene una referencia de Process válida, y puede invocar el método destroy() en la clase Process para matar ese proceso en particular.

Pero tenga en cuenta que si el proceso que invoca crea nuevos subprocesos, es posible que no finalicen (consulte http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 ).

Por otro lado, si desea eliminar procesos externos (que no generó de su aplicación Java), entonces una cosa que puede hacer es llamar a las utilidades O / S que le permiten hacer eso. Por ejemplo, puede probar un comando Runtime.exec() on kill en Unix / Linux y verificar los valores devueltos para asegurarse de que la aplicación se eliminó o no (0 significa éxito, -1 significa error). Pero eso, por supuesto, hará que su plataforma de aplicación sea dependiente.