26

ProcessBuilderCommons execを使用するかどうかを決定しようとしていますが、

私の要件は、私が気にしないstdout/stdin/stderrを持つデーモンプロセスを作成しようとしているということです。さらに、時が来たら、このプロセスを破棄するために kill を実行したいと考えています。

LinuxでJavaを使用しています。

どちらにも問題と落とし穴があることを知っています (別のスレッドを使用してストリームを飲み込むと、ブロックやデッドロックが発生する可能性があり、ストリームを閉じて開いているファイルがぶら下がったままにならないようにするなど)。方法または他の方法、および従うべき優れたリソース。

4

5 に答える 5

13

ZT Process Executorライブラリは、Apache Commons Execの代替です。コマンドの実行、出力のキャプチャ、タイムアウトの設定、プログラムの終了ステータスの確認などの機能があります。

私はそれを少し使用しましたが、適切に設計され、かなり十分に文書化されていることがわかりました。

ドキュメントの例

コマンドを実行し、stderr をロガーに送り、出力を UTF8 文字列として返します。

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

そのドキュメントには、Commons Exec に対する次の利点が記載されています。

  • ストリームの処理の改善
  • ストリームへの読み取り/書き込み
  • stderr を stdout にリダイレクトする
  • タイムアウト処理の改善
  • 終了コードのチェックの改善
  • 改善された API
  • 非常に複雑なユースケースのためのワンライナー
  • プロセス出力を文字列に取得するための 1 つのライナー
  • 利用可能なProcessオブジェクトへのアクセス
  • 非同期プロセスのサポート ( Future )
  • SLF4J APIによるロギングの改善
  • 複数のプロセスのサポート
于 2016-07-30T14:28:29.307 に答える
10

commons-exec は私が今まで使った中で最高のライブラリではありませんが、stdout/sterr を適切に処理/消費する Java プロセス呼び出しの最大の落とし穴を解決してくれます。私は過去にProcessBuilderを使用しましたが、これは問題ありません.commons-execも問題なく、一般的なケースのほとんどを簡単に処理できます。

于 2010-06-15T19:09:01.693 に答える
3

私のExec ライブラリに興味があるかもしれません。

于 2012-03-17T11:38:21.540 に答える
1

Commons Daemonは、Javaプロセスをデーモンとして開始する役割を果たしますが、期待どおりには実行されません。たとえば、標準のCプログラムがデーモンを起動すると(たとえば、apacheやsshdを使用)、バックグラウンドにフォークする前に、いくつかの構成の健全性チェックやその他の処理(ロックファイルのロックなど)を実行します。Apache Commons Daemonは、Javaアプリを起動し、JavaコードAFAIKに健全性チェックを入れないようにするacプログラムであるため、重要なデーモン機能と見なされるものを壊します。

したがって、sshd、apacheなどと同様に動作するデーモンランチャーの実装を検討している場合は、commonsexecをお勧めします。

于 2010-09-22T21:17:45.700 に答える
1

デーモン プロセスを使用する場合は、Apache Commons Daemon の方が適しているのではないでしょうか。

于 2010-07-07T10:49:00.740 に答える