En Linux cuando ejecuto la función de destrucción en el objeto java.lang.Process (que es verdadero tipeado java.lang.UNIXProcess) envía un Señal SIGTERM para procesar, ¿hay alguna manera de matarlo con SIGKILL?cómo puedo matar un proceso de Linux en java con SIGKILL Process.destroy() hace SIGTERM
Respuesta
No se usa Java puro.
La alternativa más simple es utilizar Runtime.exec()
para ejecutar un comando kill -9 <pid>
como un proceso externo.
Lamentablemente, no es tan fácil hacerse con el PID. Necesitarás usar reflexión black-magic para acceder al campo private int pid
, o perder el resultado del comando ps
.
ACTUALIZACIÓN - en realidad, hay otra manera. Cree una pequeña utilidad (programa C, script de shell, lo que sea) que ejecutará la aplicación externa real. Codifique la utilidad para que recuerde el PID del proceso hijo y configure un controlador de señal para SIGTERM que SIGKILL procesará al niño.
Stephen su respuesta es correcta. Escribí lo que dijo:
public static int getUnixPID(Process process) throws Exception
{
System.out.println(process.getClass().getName());
if (process.getClass().getName().equals("java.lang.UNIXProcess"))
{
Class cl = process.getClass();
Field field = cl.getDeclaredField("pid");
field.setAccessible(true);
Object pidObject = field.get(process);
return (Integer) pidObject;
} else
{
throw new IllegalArgumentException("Needs to be a UNIXProcess");
}
}
public static int killUnixProcess(Process process) throws Exception
{
int pid = getUnixPID(process);
return Runtime.getRuntime().exec("kill " + pid).waitFor();
}
También puede obtener el pid de esta manera:
public static int getPID() {
String tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
tmp = tmp.split("@")[0];
return Integer.valueOf(tmp);
}
en linux, ejecuto comandos a través de java (proceso interactivo): nslookup -> google, esto bloquea el proceso, y no puedo matar este proceso. Así que ahora usé su sugerencia, pero no finaliza este proceso, simplemente se cuelga y no puedo finalizar mi programa. Incluso traté de matar el pid manualmente, pero en vano, ¿qué debo hacer? –
@Space Rocker: un kill simple envía un SIGTERM. Un "kill -9" envía un SIGKILL. Pruebe "kill -9 -1": envía SIGKILL a todos los procesos en el grupo de procesos pid> 1. Si eso no lo mata, nada lo hará. Pero esto funcionará. –
Definitivamente use la segunda forma de obtener auto PID. VisualVM hace lo mismo. La primera forma es fea, no es multiplataforma, y puede que no funcione en futuras versiones de Java. – Espinosa
Si conoce el nombre proceso puede utilizar pkill
Runtime.getRuntime().exec("pkill firefox").waitFor();
Desde Java 1.8
puede llamar al método destroyForcibly()
, que llama al destroy()
conocido hod por defecto, pero según los documentos de Java, todos los subprocesos devueltos por ProcessBuilder
o Runtime.exec()
implementan este método.
Desafortunadamente, actualmente la implementación simplemente llama a 'destroy()'. Vea aquí: https://bugs.openjdk.java.net/browse/JDK-8056139 – Joe
- 1. Guardar gmon.out antes de matar un proceso
- 2. Java - Código fuente Process.destroy() para Linux
- 3. ¿Cómo puedo encontrar el ID de proceso (pid) de un proceso iniciado en Java?
- 4. ¿Cómo matar un proceso nohup?
- 5. Recursively matar proceso R con niños en linux
- 6. Cómo matar un proceso en Java, dado un PID específico
- 7. ¿Cómo matar un proceso C#?
- 8. Proceso asesinado por SIGKILL
- 9. Diferencia entre SIGTER SIGTERM considerando el árbol de proceso
- 10. ¿Cómo matar un proceso abierto en node.js?
- 11. ¿Matar un proceso en ejecución en ColdFusion?
- 12. ¿Cómo matar un proceso en cygwin?
- 13. Cómo manejar con gracia la señal SIGKILL en Java
- 14. ¿Cómo matar un proceso en MacOS?
- 15. ¿Cómo puedo matar un árbol de procesos completo con Perl?
- 16. matar a un proceso iniciado con popen
- 17. Cómo manejar un SIGTERM
- 18. Cómo matar un proceso de WiX
- 19. Matar proceso abandonada en Heroku
- 20. ¿Cómo puedo matar un hilo de otro hilo en Java?
- 21. Cómo matar el proceso de Java en Windows, SIN matar a javaw.exe?
- 22. matar a un proceso en bash
- 23. ¿Cómo matar un proceso secundario por el proceso principal?
- 24. Cómo vincular una clave a sigkill en bash?
- 25. Matar a un proceso creado con subprocess.Popen de Python()
- 26. Leiningen: ¿cómo matar el proceso del niño?
- 27. Cómo matar el proceso de trazado en R?
- 28. ¿Cómo detener el proceso 'ininterrumpible' en Linux?
- 29. Cómo puedo matar un hilo en python
- 30. Linux: ¿Cómo matar programas que usan el puerto 1935?
Puedo hacerlo así o en JNI, aunque no estoy dispuesto a hacerlo de esta manera, ¿cómo sabes el pid del proceso que desea matar? – ekeren
Primero gracias por estas respuestas. reflexión y JNI/exec son mi último recurso, me pregunto si alguien puede encontrar una manera más elegante de hacer esto. – ekeren
También soy duro con respecto a un verdugo envoltorio, en realidad mi jefe es duro al respecto :), así que entiendo que no hay una forma directa de hacer esto que usted sepa. – ekeren