2009-07-15 4 views
9

私はいくつかのコードを継承していますプロセスビルダーのwaitFor()問題とオープンファイルの制限

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の新人です。これは私に困惑している地獄の奇妙なものでした。 (うれしいことに、アプリはまだ何とか実行されています。)非常に大きなログファイルを吐き出した後に

これを回避したり、バッファをクリアしたり、ファイルのオープン制限をjvmができる場所

+0

対象のOS(およびバージョン)は何ですか?これを参照してください。http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2007-02/msg00873.html –

+0

Debianを使用し、のunameの外にクリアされているようです。最新の安定したものになるでしょう。無制限に – Louis

答えて

14

私はこれらのchmodコマンドをループ内で実行していると推測します。そうしないと、なぜ多くの例外が発生するのかわかりません。生成されたプロセスの出力を読み取っていないため、デッドロックになる可能性があります。それは確かに前に私を噛んでいた。ProcessBuilderRuntime.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 
} 

(クレジット:this site)、それは状況に役立ちますかどうかを確認します。

+0

\、同じ例外が、私はそれが数分で私の答えをチェックし解決したと思う – Louis

+0

発生している - それは溶液中で、これを必要に応じてちょうど – Louis

+0

[OK]を確認するためのテストで待機していることは答えとしてあなたを選んだの私のポストに必要な余分な行が含まれることを確認してください。 – Louis

0

ファイルを閉じることなくプロセスが実際に完了するとは思われません。これは非常に大きなスレッド数で起こっているのでしょうか?あるいは、それらのうちのいくつかは実際には完了していません(つまり、waitForでハングしている場合もあります)。

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

+0

セット:これを試し – Louis

0

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

6

助けてくださってありがとうございました。これは、他の場所で起こっている奇妙な負荷を分類する必要があります。あなたの(ビナイ)の例と、ストリームの閉鎖を使用して

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・マシューズpostからアイデアを得ました。

+0

注:まだのwaitForを持つとうまくしないだろう、入力ストリームを閉じ、なぜ意味をなさないが、私はそれは、Java ... – Louis

+1

グッドキャッチ、ジムだと思いますが、私はまだあなたの 'finally'に問題が表示されません。 。私は '()' p.getInputStream.closeを行っているときに例外が発生しそうならば、あなたは自分の 'catch'で' close'のコールのそれぞれを持っている必要があると思う、あなたは他人を閉じるために失敗します。この問題は、現在は消えているように見えるかもしれませんが、後で復帰する可能性があります。 –

+0

良い点。 thanks – Louis

関連する問題