2009-07-28 16 views
5

Sto cercando alcune semplici attività come elencare tutto il processo in esecuzione di un utente, o uccidere un particolare processo tramite pid, ecc. Gestione di unix di base da Java. Esiste una biblioteca là fuori che è relativamente matura e documentata? Potrei eseguire un comando esterno dalla JVM e quindi analizzare l'output/errore standard, ma sembra molto lavoro e non è affatto robusto. Eventuali suggerimenti?Qual è il modo migliore per gestire il processo unix da java?

risposta

4

Sarà necessario eseguire il rollover della propria soluzione. L'uccisione di un processo esterno creato utilizzando le API Process può essere eseguita utilizzando Process.destroy(). (Ma nota che destroy() come implementato su Linux/Unix fa un "soft" uccidere, non un SIGKILL, in modo che il processo esterno può essere in grado di evitare di essere uccisi.)

Nulla al di là cioè non portabile.

  • processi Listing (su una macchina Linux) può essere fatto leggendo il /proc file system.
  • È possibile eseguire altre operazioni chiamando un comando nativo utilizzando Process. Dipende se la funzionalità di gestione richiede l'uso di syscalls che non sono disponibili per un programma Java "puro".
  • È possibile (in teoria) utilizzare JNI e codice nativo per scavare nelle strutture dati native della JVM per trovare il PID a livello di sistema operativo per il processo e inviarlo a un segnale.

Se si segue il percorso della libreria nativa di JNI +, fare attenzione ai problemi del puntatore nativo e ai problemi di thread nativo che possono interrompere la JVM. Potrebbe anche essere necessario occuparsi della creazione e distribuzione della libreria nativa per più architetture, ecc. Inoltre, fare attenzione che le strutture di dati interne possano essere diverse per diverse piattaforme JVM, versioni, ecc. E che sono soggette a modifiche senza preavviso.

1

Si potrebbe provare JNA Posix. Se le funzioni appropriate non vengono esportate da quella libreria, è molto facile aggiungere il supporto per esse con JNA (l'ho fatto per molte API Win32).

0

Gnome System Monitor (versione linux di Task Manager di Windows) utilizza il pacchetto libgtop2. Documnetation qui: http://library.gnome.org/devel/libgtop/stable/

Inoltre è possibile controllare la sorgente di Monitor di sistema per vedere come utilizza le funzioni libgtop2.

+0

Buona fortuna con la vostra stabilità JVM se si usa JNI per chiamare le funzioni libgtop2 da Java :-) –

0

La maggior parte delle informazioni necessarie è disponibile tramite il file system /proc, sebbene sia possibile richiedere le autorizzazioni corrette per leggere tutto lì. Nota che i contenuti di/proc sono specifici per Unix - ad es. diverso su Linux/Solaris, e non ho idea di re. MacOSX.

Se si vuole uccidere un processo che si è generato autonomamente, vale la pena guardare Process.destroy(). Altrimenti dovrai eseguire kill. Per utilizzare questa ben si dovrebbe inviare un SIGINT, e se questo non funziona, quindi inviare un SIGKILL (di interrompere forzatamente - non sono sicuro se Process.destroy() fa questo)

1

Ecco un metodo per inviare SIGKILL a un processo da Java. Usa la riflessione per ottenere il valore del pid dalla sottoclasse Process. Testato con successo su Mac OS X 1.6 (Snow Leopard) e OpenSuse 11.4, java 1.6 64-bit HotSpot JVM ma ovviamente nessuna garanzia di portabilità.

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

vi consiglio JavaSysMon: È possibile elencare i processi (pid, PPID, nome e così via), uccidere i processi (processi figlio compreso) e monitorare il computer. Se si desidera utilizzarlo in un progetto 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> 
Problemi correlati