2009-07-15 13 views
9

Bazı kod miras:Proses Oluşturucu BEKLE() sorunu ve Açık dosya sınırlamaları

Process p = new ProcessBuilder("/bin/chmod", "777", path).start(); 
p.waitFor(); 

Temelde, dosyaları olarak diskte anahtar/değer çiftlerini depolamak için bazı son derece eski ve büyü esaslı bir sebebi yoktur. Buna gerçekten girmek istemiyorum. - Milyonlarca

ben BEKLE çağrısı oldu duygu durdurmak için olsun

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 

Ve 10 k alemlerinde demek bir grup tarafından:

Ancak, IO istisnalar bir avuç kaldım Bu işlemin tamamlanmasını beklemek ve işlemin tamamlanmasını beklemek, ancak dosyanın gerçekten kapatılmasından önce bir sonuca geri döndüğünü düşünüyorum. Bu istisnaların sebebi olup olmayacağını bilen var mı?

Diğer eğimim, binlerce dosyanın açılmasının ve kapatılmasının java ucunda yeterince hızlı olmayışı ve başka bir şey olduğunu, belki de bir şey değil, fw.close() çağrıldığında temizleniyor.

Ben java için oldukça yeni ve bu beni güldürdü cehennem garip bir oldu. tamponlarını temizledikten falan dosyaları açık sınırı artırarak, bu aşmanın bir yolu başkasının düşünce

Can nerede jvm can (memnuniyetle app hala çok büyük bir günlük dosyası tükürme sonra .. nasılsa çalışır) kendisiyle devam edin (sorun olduğunu varsayarak)

+0

Hedef işletim sisteminiz (ve sürümünüz) nedir?Şuna bakın: http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2007-02/msg00873.html –

+0

debian, uname dışı silinmiş gibi görünüyor. son kararlı olacak. – Louis

cevap

14

Bu chmod komutlarını bir döngüde çalıştırdığınızı varsayardım - aksi halde neden bu kadar çok özel durum aldığınızı anlayamıyorum. Ölü bir kilitleme isabet ediyor olabilirsiniz, çünkü ortaya çıkan süreçlerin çıktısını okumadınız. Bu kesinlikle beni ProcessBuilder, Runtime.exec() günlerinde ısırmaya alışkınımdı.

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 
} 

(kredi: this site)

yukarıdaki desen için kod parçacığını değiştirin

ve bu duruma yardım olmadığını görmek.

+0

Bunu denedim, aynı istisnalar oluştu – Louis

+0

Sanırım birkaç gün içinde cevabımı kontrol ettim - sadece testlerde beklemek için – Louis

+0

doğrulayın. , gönderimi kontrol et, gerekli ekstra satırları içerecek. – Louis

0

Sürecin dosyaları kapatmadan gerçekten tamamlanmasını beklemek pek olası görünmüyor. Bu çok büyük bir iş parçacığında olabilir mi? Ya da belki de bazıları aslında tamamlamıyor (yani, bazı durumlarda waitFor'da asılıyor)? Aksi takdirde, açık dosya limitini arttırmak zorunda kalırsınız diye düşünüyorum. Bunun Unix benzeri bir sistem olduğunu varsayarak, "ulimit" komutu muhtemelen sizin aradığınız şeydir.

+0

sınırsız olarak ayarlandı: \ – Louis

0

JAVA 6 kullanıyorsanız, File nesnesindeki yeni setleyicileri (okuma, yazma, yürütme) deneyebilirsiniz. Daha yavaş olabilir, ama işe yaramalı.

6

Yardımlarınız için teşekkürler, bunun nedeni başka yerlere giden bir tuhaflık yükü. sizin (Vinay) örnek ve akarsu kapanması kullanma

:

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 post fikri var.

+0

not: hala waitFor olan ve giriş akışlarını kapatmanın neden iyi olacağını anlamıyor ama sanırım bu java ... – Louis

+1

İyi yakalama, jim, ama hala 'nihayetinde bir problem görüyorum . Ben kendi "catch" çağrılarının her birine sahip olmanız gerektiğini düşünüyorum, aksi takdirde 'p.getInputStream.close() 'işlevini kullanırken bir istisna oluşursa, diğerlerini kapatamazsınız. Sorun şu an ortadan kalkmış gibi görünebilir, ancak daha sonra geri gelebilir. –

+0

iyi nokta. teşekkürler – Louis