2009-07-28 18 views
5

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

4

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.

1

Puede probar JNA Posix. Si las funciones apropiadas no son exportadas por esa biblioteca, es muy fácil agregar soporte para ellas con JNA (lo he hecho para muchas API de Win32).

0

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.

+0

Buena suerte con su estabilidad de JVM si usa JNI para llamar a las funciones de libgtop2 desde Java :-) –

0

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)

1

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(); 
    } 
2

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> 
Cuestiones relacionadas