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
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.
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.
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)
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();
}
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>
- 1. Qual è il modo migliore per gestire più azioni?
- 2. Qual è il modo migliore per eseguire codice Java sandboxed?
- 3. Il modo migliore per gestire l'unione JPA?
- 4. Il modo migliore per gestire più costruttori in Java
- 5. Qual è il modo migliore per usare il codice Python da Scala (o Java)?
- 6. Qual è il modo migliore per chiamare il codice Java da Python?
- 7. Il modo migliore per gestire un KeyNotFoundException
- 8. Qual è il modo migliore per C# app per comunicare unix C++ app
- 9. Qual è il modo migliore per documentare il codice f #?
- 10. Qual è il modo migliore per gestire gli aggiornamenti quando il calendario sincronizza nuovi eventi?
- 11. Qual è il modo migliore per reimparare una lingua?
- 12. Qual è il modo migliore per rilevare il colore bianco?
- 13. Qual è il modo migliore per riutilizzare il parser Lua?
- 14. Qual è il modo migliore per rilevare l'eccezione nell'attività?
- 15. Il modo migliore per riorganizzare un ArrayList in Java
- 16. Qual è il modo migliore per guardare un'applicazione desktop?
- 17. Qual è il modo migliore per simulare java.lang.Thread?
- 18. Qual è il modo migliore per eseguire il bulk degli inserimenti del database da C#?
- 19. Qual è il modo migliore per comunicare tra due server?
- 20. Qual è il modo migliore per effettuare backup automatici?
- 21. Qual è il modo migliore per gestire GoBack per le diverse piattaforme MvvmCross (v3)
- 22. Qual è il modo migliore per gestire cert/chiave per contenitori Docker che devono comunicare TLS
- 23. Qual è il modo migliore per riutilizzare le classi da un altro progetto Java in Eclipse?
- 24. Qual è il modo migliore per "ripristinare" le modifiche?
- 25. Qual è il modo migliore per analizzare questo in C++?
- 26. Qual è il modo migliore di adattare questo sistema di sicurezza per gestire l'ereditarietà multipla?
- 27. Qual è il modo migliore per gestire gli eventi in Ember.js?
- 28. Qual è il modo migliore per testare un'app per rails?
- 29. Qual è il modo migliore per gestire la matematica del tempo in Perl?
- 30. Qual è il modo migliore per gestire un albero delle dipendenze in .NET?
Buona fortuna con la vostra stabilità JVM se si usa JNI per chiamare le funzioni libgtop2 da Java :-) –