java process apache-commons-exec

java - Decidir entre el ejecutivo de Apache Commons o ProcessBuilder



Estoy tratando de decidir si usar ProcessBuilder o Commons exec,

Mis requisitos son que simplemente estoy tratando de crear un proceso de daemon cuyo stdout / stdin / stderr no me importa. Además, quiero ejecutar un asesinato para destruir este proceso cuando llegue el momento.

Estoy usando Java en Linux.

Sé que ambos tienen sus dolores y dificultades (por ejemplo, asegurarse de usar un hilo separado para tragar flujos puede provocar bloqueos o interbloqueos y cerrar los flujos para no dejar archivos abiertos colgando) y quería saber si alguien tenía sugerencias. de una manera u otra, así como cualquier buen recurso a seguir.


Commons Daemon hace el trabajo de iniciar un proceso de Java como un daemon, pero no lo hace de la manera que uno esperaría. Por ejemplo, cuando un programa C estándar inicia un demonio (tome apache o sshd, por ejemplo), realiza algunas verificaciones de configuración y otras cosas (como bloquear un archivo de bloqueo) antes de ingresar al fondo. Apache Commons Daemon es un programa de CA que lanza una aplicación java y no te permite poner los controles de seguridad en el código de Java AFAIK y, por lo tanto, rompe lo que consideraría instalaciones importantes para los demonios.

Por lo tanto, si está buscando implementar un iniciador de daemon que se comporte de forma similar a sshd, apache, etc., entonces sugeriría commons exec.


La biblioteca ZT Process Executor es una alternativa a Apache Commons Exec. Tiene funcionalidad para ejecutar comandos, capturar su salida, establecer tiempos de espera, etc.

No lo he usado todavía, pero se ve razonablemente bien documentado.

Ejemplo de la documentación: Ejecución de un comando, bombeo del stderr a un registrador, devolviendo la salida como una cadena UTF8.

String output = new ProcessExecutor().command("java", "-version") .redirectError(Slf4jStream.of(getClass()).asInfo()) .readOutput(true).execute() .outputUTF8();

Su documentación enumera las siguientes ventajas sobre Commons Exec:

  • Manejo mejorado de arroyos.
    • Lectura / escritura a streams
    • Redireccionando stderr a stdout
  • Manejo mejorado de tiempos de espera.
  • Comprobación mejorada de códigos de salida.
  • API mejorada
    • One liners para casos de uso bastante complejos.
    • One liners para obtener la salida del proceso en una cadena
    • Acceso al objeto Proceso disponible.
    • Soporte para procesos asíncronos ( Futuro ).
  • Registro mejorado con SLF4J API
  • Soporte para múltiples procesos.

Si desea utilizar un proceso de daemon, ¿quizás Apache Commons Daemon sería más apropiado?


commons-exec no es la mejor biblioteca que he usado, pero resuelve el problema más grande en la invocación del proceso Java, que es el manejo / consumo de stdout / sterr correctamente. He usado ProcessBuilder en el pasado, lo cual está bien, y commons-exec ahora que también está bien y maneja la mayoría de los casos comunes fácilmente.