Estoy buscando algunas tareas simples como enumerar todo el proceso en ejecución de un usuario, o matar un proceso particular por pid etc. Gestión básica de procesos de Unix desde Java. ¿Hay una biblioteca que esté relativamente madura y documentada? Podría ejecutar un comando externo desde la JVM y luego analizar el resultado/error estándar, pero eso parece mucho trabajo y nada sólido. ¿Alguna sugerencia?¿Cuál es la mejor manera de administrar el proceso de Unix desde Java?
Respuesta
Necesitarás rodar tu propia solución, creo. La eliminación de un proceso externo creado utilizando las API Process
se puede hacer usando Process.destroy()
. (Pero tenga en cuenta que destroy()
implementado en Linux/Unix realiza una eliminación "suave", no es un SIGKILL
, por lo que el proceso externo puede evitar ser asesinado)
Cualquier cosa más allá de eso no es portátil.
- Los procesos de listado (en una máquina con Linux) se pueden realizar leyendo el sistema de archivos
/proc
. - Se pueden hacer otras cosas llamando a un comando nativo usando
Process
. Depende de si su funcionalidad de gestión requiere el uso de llamadas de sistema que no están disponibles para un programa Java "puro". - Es posible (en teoría) utilizar JNI y código nativo para buscar en las estructuras de datos nativas de la JVM para encontrar el PID de nivel de sistema operativo para el proceso y enviarle una señal.
Si va por la ruta de la biblioteca nativa JNI +, tenga cuidado de que los problemas del puntero nativo y los problemas de enhebrado nativo pueden matar su JVM. También es posible que deba ocuparse de construir y distribuir la biblioteca nativa para múltiples arquitecturas, etc. También tenga en cuenta que las estructuras internas de datos pueden ser diferentes para diferentes plataformas JVM, lanzamientos, etc., y que pueden sufrir cambios sin previo aviso.
El monitor del sistema Gnome (versión de Linux del Administrador de tareas de Windows) utiliza el paquete libgtop2. Documnetation aquí: http://library.gnome.org/devel/libgtop/stable/
También puede consultar la fuente de System Monitor para ver cómo utiliza las funciones de libgtop2.
La mayor parte de la información que necesita está disponible a través del sistema de archivos /proc
, aunque es posible que necesite los permisos adecuados para leer todo lo que allí se encuentre. Tenga en cuenta que los contenidos de/proc son específicos de Unix, p. diferente en Linux/Solaris, y no tengo idea re. Mac OS X.
Si quiere matar a un proceso que ha engendrado usted mismo, entonces vale la pena mirar Process.destroy()
. De lo contrario, tendrá que ejecutar kill
. Para utilizar este bien debe enviar una SIGINT
, y si eso no funciona, a continuación, enviar un SIGKILL
(de suspender forzadamente - No estoy seguro de si Process.destroy()
hace esto)
Aquí es un método para enviar SIGKILL a un proceso de Java. Utiliza la reflexión para obtener el valor pid de la subclase Process. Probado con éxito en Mac OS X 1.6 (Snow Leopard) y OpenSuse 11.4, java 1.6 64-bit HotSpot JVM pero obviamente no hay garantías de portabilidad.
try {
Process p = Runtime.getRuntime().exec("sleep 10000");
Field pidField = p.getClass().getDeclaredField("pid");
pidField.setAccessible(true);
final int pid = pidField.getInt(p);
Process killProcess = Runtime.getRuntime().exec("kill -9 " + pid);
killProcess.waitFor();
System.out.println(p.exitValue());
} catch (Exception e) {
e.printStackTrace();
}
recomiendo JavaSysMon: Se pueden listar los procesos (PID, ppid, nombre, etc.), los procesos de matar (procesos secundarios incluido) y controlar el ordenador. Si desea utilizarlo en un proyecto de Maven:
<dependency>
<groupId>javasysmon</groupId>
<artifactId>javasysmon</artifactId>
<version>0.3.3</version>
</dependency>
<repository>
<id>javasysmon-repo</id>
<url>http://openr66.free.fr/maven2/</url>
</repository>
- 1. La mejor manera de administrar datos redis
- 2. ¿Cuál es el mejor lisp/esquema para unix scripting?
- 3. ¿Cuál es la mejor manera de encontrar el directorio de inicio de los usuarios en Java?
- 4. ¿Cuál es la mejor manera de gestionar el cambio?
- 5. ¿Cuál es la mejor manera de administrar las instalaciones de TYPO3 utilizando git?
- 6. Cuál es la mejor manera de administrar los datos de configuración
- 7. ¿Cuál es la mejor manera de administrar fragmentos de código en Xcode?
- 8. ¿Cuál es la mejor manera de administrar versiones paralelas en Git?
- 9. ¿Cuál es la mejor manera de llamar al código Java desde Python?
- 10. ¿Cuál es la mejor manera de administrar las fechas en PHP, MySQL, etc.?
- 11. ¿Cuál es la mejor manera de detener la ejecución de un proceso de Unicorn Server?
- 12. ¿La mejor manera de administrar fragmentos de código en Linux?
- 13. La mejor manera de administrar la conexión de base de datos para un servlet de Java
- 14. ¿Cuál es la mejor manera de reemplazar remote.origin.url en Git?
- 15. ¿Cuál es el mejor datepicker de Java ..?
- 16. La mejor manera de ejecutar AppleScript desde Java
- 17. ¿Cuál es la mejor manera de documentar el código f #?
- 18. ¿Cuál es la mejor manera de probar el código GWT
- 19. ¿cuál es la mejor manera de editar el archivo csv
- 20. ¿Cuál es la mejor manera de reutilizar el analizador Lua?
- 21. ¿Cuál es la mejor manera de administrar la concurrencia en una aplicación de acceso a la base de datos?
- 22. ¿Cuál es la mejor manera de organizar múltiples subvistas?
- 23. hilo de Java que es mejor manera?
- 24. ¿Cuál es la mejor manera de descargar el archivo desde el servidor
- 25. ¿Cuál es la mejor manera de insertar inserciones de bases de datos a granel desde C#?
- 26. ¿Cuál es la mejor manera de usar SOAP con Ruby?
- 27. ¿Cuál es la mejor manera de hacer respaldos automáticos?
- 28. La mejor manera de alterar las constantes en el proceso de compilación de Java
- 29. ¿Cuál es la mejor manera de integrar el proveedor de Bouncy Castle en un programa Java?
- 30. ¿Cuál es la mejor manera de hacer el desarrollo de Java en Emacs?
Buena suerte con su estabilidad de JVM si usa JNI para llamar a las funciones de libgtop2 desde Java :-) –