プロセスビルダwaitFor()号及びファイルを開く制限
-
13-09-2019 - |
質問
していま継承した一部のコード:
Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();
基本的には、一部の古代高強に基づく理由の保存キーと値のペアディスクにファイルが含まれています。んですが、行きたいです。
しかし、私は残っIO例外:
Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
とろんの領域で10k-百万
もののwaitFor呼び出しを停止しこれらの発生の過程を修了することができ、出口戻したいと思いchmodが返す結果前ファイルは閉じられます。なんだろうけど、日本人の場合この原因はこれらの例外?
私はその他の傾向の開閉のファイルが起こりません迅速に、java終わることだが、そのようなものがあるとの形式のファイルのバッファーとなクリア時fwまでclose()が呼び出されます。
い新しいjava、この地獄かというのは私stumped.(喜んでこのアプリがなんだか..後吐きの時に書き出して非常に大きいログファイル)
で誰も考えをわかりやすく伝えるための周辺のこのリバッファを増やファイルを開くに制限はないのjvmを維持することが可能とな自身が前提となる問題)
解決
私はあなたがループ内でこれらのchmodコマンドを実行していると推定 - あなたは非常に多くの例外を取得したい、なぜそう私は表示されません。それはあなたが生成されたプロセスの出力を読んでいないので、あなたがデッドロックを打っていることが可能です。それは確かに前ProcessBuilder
、Runtime.exec()
日に私をバックかむために使用される。
上記のパターンにあなたのコードスニペットを変更します:
try {
ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);
pb.redirectErrorStream(true); // merge stdout, stderr of process
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
String lineRead;
while ((lineRead = br.readLine()) != null) {
// swallow the line, or print it out - System.out.println(lineRead);
}
int rc = p.waitFor();
// TODO error handling for non-zero rc
}
catch (IOException e) {
e.printStackTrace(); // or log it, or otherwise handle it
}
catch (InterruptedException ie) {
ie.printStackTrace(); // or log it, or otherwise handle it
}
他のヒント
ヘルプみんなのおかげで、これはそれのために他の場所で起こってすごみの負荷を整理する必要があります。
あなた(ビナイ)の例と、ストリームの閉鎖を使用します:
try{
fw.close();
ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);
pb.redirectErrorStream(true); // merge stdout, stderr of process
p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
String lineRead;
while ((lineRead = br.readLine()) != null) {
// swallow the line, or print it out - System.out.println(lineRead);
}
} catch (Exception ioe) {
Logger.logException(Logger.WARN, ioe.getMessage(), ioe);
} finally {
try {
p.waitFor();//here as there is some snipped code that was causing a different
// exception which stopped it from getting processed
//missing these was causing the mass amounts of open 'files'
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (Exception ioe) {
Logger.logException(Logger.WARN, ioe.getMessage(), ioe);
}
}
ジョン・B・マシューズ<のhref = "http://groups.google.com/group/comp.lang.java.programmer/browse_thread/thread/d370f140c9f223a3?pli=1" のrel = "noreferrer" からアイデアを得ました>ポストでます。
プロセスが実際にファイルを閉じることなく完了だろうとは考えにくいです。これは、スレッドの非常に大きな#で何が起こっていませんか?それともそれらのいくつかは、実際に(すなわち、それはいくつかのケースでのwaitForでぶら下がっている)を完了していない?
そうでなければ、私はあなたが開いているファイルの制限の増加に伴って立ち往生することになると思います。これはUnixライクなシステムであると仮定すると、「ulimitの」コマンドは、あなたが探しているものと考えられます。
使用している場合は、JAVA6,きものセッター(読み書き実行)のファイルオブジェクトです。が遅くなることができます。