2009-07-15 20 views
9

Tôi đã thừa hưởng một số mã:Process Builder WAITFOR() phát hành và mở tập tin hạn chế

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

Về cơ bản, có đối với một số lý do dựa voodoo cổ và đánh giá cao để lưu trữ cặp khóa/giá trị trên đĩa dưới dạng file. Tôi không thực sự muốn đi vào nó.

Tuy nhiên, tôi đang trái với một loạt các trường hợp ngoại lệ 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 

Và bằng một bó Ý tôi là trong cõi 10k - hàng triệu

tôi nhận được những cảm nhận cuộc gọi WAITFOR là để ngăn chặn những điều này xảy ra khi chờ quá trình hoàn thành và thoát ra, tuy nhiên tôi nghĩ rằng chmod sẽ trả về kết quả trước khi tệp thực sự bị đóng. Có ai biết nếu đó sẽ là nguyên nhân của những ngoại lệ này?

Độ nghiêng khác của tôi là việc mở và đóng hàng nghìn tệp không diễn ra đủ nhanh trên đầu java và có điều gì đó khác đang xảy ra, có thể giống như vậy có một số dạng đệm tệp không phải bị xóa khi fw.close() đang được gọi.

Tôi khá mới đối với java và đây là một điều quái dị khiến tôi bối rối. (sẵn sàng ứng dụng vẫn chạy bằng cách nào đó .. sau khi khạc ra một tệp nhật ký rất lớn)

Có thể ai khác nghĩ ra cách để giải quyết vấn đề này, xóa bộ đệm hoặc tăng các tệp mở giới hạn vào thứ gì đó mà jvm có thể theo kịp với chính nó (giả sử đó là vấn đề)

+0

Hệ điều hành đích (và phiên bản) của bạn là gì.Xem này: http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2007-02/msg00873.html –

+0

debian, có vẻ như nó đã bị xóa khỏi sự không rõ. sẽ ổn định mới nhất. – Louis

Trả lời

14

Tôi đoán bạn đang chạy các lệnh chmod này trong một vòng lặp - nếu không, tôi không thấy lý do tại sao bạn nhận được rất nhiều ngoại lệ. Có thể bạn đang nhấn bế tắc vì bạn không đọc kết quả của quá trình sinh sản. Điều đó chắc chắn được sử dụng để cắn tôi trở lại trước ProcessBuilder, Runtime.exec() ngày.

Thay đổi đoạn mã của bạn để mô hình trên:

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 
} 

(tín dụng: this site) và xem giúp tình hình.

+0

Đã thử điều này, ngoại lệ tương tự đang xảy ra – Louis

+0

Tôi nghĩ rằng tôi đã giải quyết nó kiểm tra câu trả lời của tôi sau một vài phút - chỉ cần chờ đợi kiểm tra để xác minh – Louis

+0

Ok chọn của bạn là câu trả lời vì nó cần thiết trong giải pháp , kiểm tra bài đăng của tôi sẽ bao gồm các dòng phụ cần thiết. – Louis

0

Dường như quá trình này thực sự hoàn thành mà không đóng các tệp. Điều này có thể xảy ra trong một số lượng rất lớn các chủ đề không? Hoặc có lẽ một số người trong số họ không thực sự hoàn thành (tức là, nó đang treo ở waitFor trong một số trường hợp)?

Nếu không, tôi nghĩ bạn sẽ bị kẹt với việc tăng giới hạn tệp đang mở. Giả sử rằng đây là một hệ thống giống Unix, lệnh "ulimit" có lẽ là những gì bạn đang tìm kiếm.

+0

thiết lập để không giới hạn: \ – Louis

0

Nếu bạn đang sử dụng JAVA 6, bạn cũng có thể thử các bộ định tuyến mới (để đọc, ghi, thực hiện) trên đối tượng Tệp. Có thể chậm hơn, nhưng nó sẽ hoạt động.

6

Cảm ơn những người giúp đỡ, điều này sẽ phân loại ra một tải của sự kỳ quặc xảy ra ở nơi khác vì nó.

Sử dụng (Vinay) ví dụ của bạn và đóng cửa suối:

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

Got ý tưởng từ John B Mathews post.

+0

lưu ý: vẫn không có ý nghĩa tại sao có waitFor và đóng các dòng đầu vào sẽ không làm tốt nhưng tôi đoán nó là ... – Louis

+1

Tốt bắt, jim, nhưng tôi vẫn thấy một vấn đề trong 'cuối cùng của bạn' . Tôi nghĩ rằng bạn cần phải có mỗi cuộc gọi 'close' trong' catch' của riêng mình, nếu không, nếu một ngoại lệ xảy ra khi thực hiện 'p.getInputStream.close()', bạn sẽ không thể đóng các lệnh khác. Vấn đề có vẻ như đã biến mất, nhưng có thể quay lại sau. –

+0

điểm tốt. thanks – Louis

Các vấn đề liên quan