Necesitamos tu apoyo para extender nuestros posts acerca de las ciencias informáticas.
Solución:
Si el proceso que desea eliminar ha sido iniciado por su aplicación
Entonces probablemente tengas una referencia a él (ProcessBuilder.start()
o Runtime.exec()
ambos devuelven una referencia). En este caso, simplemente puede llamar p.destroy()
. Creo que esta es la forma más limpia (pero tenga cuidado: los subprocesos iniciados por p
puede seguir con vida, consulte http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 para obtener más información).
El destroyForcibly
solo debe usarse si destroy()
falló después de un cierto tiempo de espera. En una palabra
- terminar el proceso con
destroy()
- permitir que el proceso finalice correctamente con un tiempo de espera razonable
- matarlo con
destroyForcibly()
si el proceso sigue vivo
Si el proceso que desea eliminar es externo
Entonces no tiene muchas opciones: debe pasar a través de la API del sistema operativo (Runtime.exec
). En Windows, el programa para llamar será taskkill.exe
mientras que en Mac y Linux puedes probar kill
.
Eche un vistazo a https://github.com/zeroturnaround/zt-exec/issues/19 y Matar un proceso usando Java y http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app- kill-any-process-after-specified-time-0133513/ para obtener más información.
Si está tratando de eliminar el proceso principal que inició su código Java, le sugiero que use System.exit()
. Los beneficios se explican aquí: ¿cuándo debemos llamar a la salida del sistema en Java?
Esencialmente, System.exit()
ejecutará ganchos de apagado que se asegurarán de que cualquier proceso dependiente que no sea un demonio que no haya completado su trabajo se elimine antes de que se elimine su proceso. Esta es la forma limpia de hacerlo.
Si el proceso no es suyo, tendrá que confiar en el sistema operativo para que haga este trabajo por usted, como se explica en esta respuesta: Matar un proceso usando Java
En ese caso, su sugerencia de Runtime.exec()
matar a *nix sería una forma decente de hacerlo.
Ahora en cuanto a destroyForcibly()
normalmente llamará a eso en un proceso secundario generado por su código Java que presumiblemente se inició con la API del proceso ProcessBuilder.start()
o Runtime.exec()
el que me funcionó es System.exit(0); funciona bien porque cierra todos los procesos y componentes que aún se están ejecutando
Reseñas y valoraciones
Te invitamos a añadir valor a nuestro contenido informacional colaborando tu veteranía en las reseñas.