2010-06-15 4 views
18

Ich versuche, darüber zu entscheiden, ob ProcessBuilder oder Commons exec zu verwenden,Entscheidung zwischen exec Apache Commons oder Process

Meine Anforderungen sind, dass ich einfach einen Dämon-Prozess zu schaffen versuche dessen stdout/stdin/stderr ich tun nicht interessiert. Außerdem möchte ich einen Kill ausführen, um diesen Prozess zu zerstören, wenn die Zeit gekommen ist.

Ich verwende Java unter Linux.

Ich weiß, dass beide ihre Schmerzen und Fallstricke (wie sicher sein, separate Thread zu verwenden, um Ströme zu schlucken Blockierungen oder Deadlocks zu schließen, und die Ströme zu schließen, damit offene Dateien nicht herumhängen lassen) und wollte wissen, ob Jeder hatte Vorschläge auf die eine oder andere Art und alle guten Ressourcen, denen er folgen sollte.

+1

Vielleicht ..., wenn Sie diese Schmerzen und Gefahren zusammengefasst? – skaffman

+0

Siehe Änderungen oben. – Traker

Antwort

8

commons-exec ist nicht die beste Bibliothek, die ich je benutzt habe, aber es hat die größte Gefahr in Java-Prozess Aufruf zu lösen, die/raubend stdout/sterr richtig verarbeitet. Ich habe ProcessBuilder in der Vergangenheit verwendet, was in Ordnung ist, und commons-exec jetzt, was auch gut ist und die meisten gängigen Fälle einfach zu handhaben sind.

1

Wenn Sie einen Daemon-Prozess verwenden möchten, wäre Apache Commons Daemon vielleicht besser geeignet?

1

Commons Daemon macht den Job ein Java-Prozess als Dämon zu starten, aber es macht es die Art und Weise nicht tun würde man erwarten. Wenn beispielsweise ein Standard-C-Programm einen Daemon startet (z. B. apache oder sshd), führen sie einige Konfigurationsüberprüfungen und andere Dinge durch (wie das Sperren einer Sperrdatei), bevor sie sich in den Hintergrund verzweigen. Apache Commons Daemon ist ein c-Programm, das eine Java-App startet und nicht erlaubt, die Plausibilitätsprüfungen in den Java-Code AFAIK zu stellen, und damit bricht, was ich als wichtige Daemon-Einrichtungen betrachten würde.

Wenn Sie also suchen einen Daemon Launcher zu implementieren, die auf sshd ähnlich verhält, Apache, usw., dann würde ich commons exec vorschlagen.

7

Die ZT Process Executor Bibliothek ist eine Alternative zu Apache Commons Exec. Es verfügt über Funktionen, Befehle auszuführen, dessen Ausgangs der Erfassung, Timeouts Einstellung usw.

ich es noch nicht verwendet haben, aber es sieht ziemlich gut dokumentiert.

Beispiel aus der Dokumentation: Ausführen eines Befehls, der an einen Stderr Loggers Pumpens Rückführen der Ausgabe als UTF8 String.

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

Die Dokumentation enthält die folgenden Vorteile gegenüber Commons Exec:

  • Verbesserte Handhabung von Streams
    • Lesen/Schreiben zu Ströme
    • Stderr Umleiten
    • nach stdout
  • Verbesserte Behandlung von Timeouts
  • Verbesserte Kontrolle der Exit-Codes
  • Verbesserte API
    • One-Liner für recht komplex usecases
    • One-Liner Prozessausgang in einen String
    • Zugang zum Prozess Objekt zur Verfügung
    • zu erhalten Unterstützung für asynchrone Prozesse (Future)
  • Verbesserte Protokollierung mit SLF4J API
  • Unterstützung für mehrere Prozesse
Verwandte Themen