Skip to content

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"));
}