5 ProcessHandle¶
Acceso a procesos vivos del sistema no creados por nosotros¶
La interfaz ProcessHandle
, disponible a partir de Java 9, nos permite identificar y controlar procesos que no hayan sido creados por nosotros a través de Runtime.exec()
o ProcessBuilder.start()
.
Por ejemplo, podemos listar todos los procesos actualmente vivos en el sistema que sean visibles para nuestro proceso usando el método estático ProcessHandle.allProcesses()
, que retorna un Stream<ProcessHandle>
, con los ProcessHandle
de dichos procesos.
Si queremos obtener el ProcessHandle
del proceso actual, podemos ejecutar el método estático ProcessHandle.current()
, y si queremos el del proceso con un determinado pid, podemos llamar el método estático ProcessHandle.of(pid)
, que retornará un Optional<ProcessHandle>
, por si no existe ningún proceso con dicho pid.
Una vez obtenido un objeto ProcessHandle
podemos usar métodos similares a los de la clase Process
, como por ejemplo: isAlive()
, pid()
, info()
, children()
, descendants()
, destroy()
, destroyForcibly()
y onExit()
, con el mismo significado que en la clase Process
.
También tenemos disponible el método parent()
, que retorna un Optional<ProcessHandle>
con el objeto ProcessHandle
del proceso padre a éste.
Por ejemplo, podemos mostrar todos los procesos vivos en el sistema que pertenezcan al mismo usuario que el proceso actual de la siguiente manera:
void showUserProcesses() {
Optional<String> currUser = ProcessHandle.current().info().user();
ProcessHandle.allProcesses()
.filter(ph -> ph.info().user().equals(currUser))
.forEach(ph -> showProcess(ph));
}
void showProcess(ProcessHandle ph) {
ProcessHandle.Info info = ph.info();
System.out.printf("pid: %d, user: %s, cmd: %s%n",
ph.pid(), info.user().orElse("none"),
info.command().orElse("none"));
}