9

私はいくつかのコードを継承しました:

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

そして、私が意味する束とは、10,000〜数百万の領域を意味します

waitFor 呼び出しは、プロセスが完了して終了するのを待ってこれらの発生を停止するためのものだと感じましたが、ファイルが実際に閉じられる前に chmod が結果を返していると思います。それがこれらの例外の原因であるかどうかは誰にもわかりますか?

私のもう1つの傾向は、Java側で何千ものファイルの開閉が十分に迅速に行われておらず、何か他のことが起こっていることです. fw.close() が呼び出されています。

私はJavaにかなり慣れていませんが、これは私を困惑させた奇妙なものでした。(幸いなことに、アプリはまだ何らかの形で実行されています..非常に大きなログファイルを吐き出した後です)

他の誰かがこれを回避する方法を考えることができますか、バッファをクリアするか、ファイルのオープン制限をjvmがそれ自体に追いつくことができるものに増やします(それが問題であると仮定します)

4

4 に答える 4

14

これらの 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
} 

(クレジット:このサイト)そして、それが状況に役立つかどうかを確認してください.

于 2009-07-15T11:07:22.173 に答える
7

助けてくれてありがとう、これはそれが原因で他の場所で起こっている奇妙なことの負荷を整理するはずです.

あなたの(Vinay)の例とストリームの閉鎖を使用して:

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

John B Mathewsの投稿からアイデアを得ました。

于 2009-07-15T23:39:07.080 に答える
0

JAVA 6 を使用している場合は、File オブジェクトで新しいセッター (読み取り、書き込み、実行用) を試すこともできます。遅くなるかもしれませんが、うまくいくはずです。

于 2009-07-15T06:18:04.923 に答える
0

ファイルを閉じずにプロセスが実際に完了する可能性は低いようです。これは、非常に多数のスレッドで発生している可能性がありますか? あるいは、それらのいくつかは実際には完了していません (つまり、waitFor でハングしている場合もあります)。

そうしないと、開いているファイルの制限を増やすことに行き詰まると思います。これが Unix ライクなシステムであると仮定すると、「ulimit」コマンドがおそらく探しているものです。

于 2009-07-15T05:11:05.557 に答える