2009-07-15 3 views
9

나는 몇 가지 코드를 상속 :프로세스 빌더 WAITFOR() 문제와 열기 파일 제한

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

는 기본적으로 파일로 디스크에 키/값 쌍을 저장하기위한 몇 가지 매우 고대 부두 기반 이유가있다. 나는 정말로 그것에 들어가기를 원하지 않는다. - 수백만

나는이 (가) WAITFOR 호출이 있었다 기분 것은 막을 얻을

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의 영역에서 의미 무리에 의해 :

그러나, 나는 IO 예외의 무리와 함께 남아 있어요 이러한 프로세스가 완료하고 다시 종료 기다리고 발생하지만, 나는 chmod 실제로 파일을 닫습 전에 결과를 반환하는 것 같아요. 그 예외의 원인이 누구인지 아는 사람 있습니까?

내 다른 성향은 수천 개의 파일을 열고 닫는 것이 Java 끝에서 충분히 빠르게 일어나지 않고 다른 일이 발생했다는 것입니다. 파일 버퍼가 아닌 파일 버퍼가 있습니다. fw.close()가 호출 될 때 지워집니다.

저는 꽤 자바에 익숙하지 않습니다. 그리고 이것은 저에게 이상한 하나였습니다. (기꺼이 앱은 여전히 ​​실행 중입니다.) 매우 큰 로그 파일을 뱉어 낸 후

다른 사람이이 문제를 해결하거나 버퍼를 지우거나 파일 열기 제한을 늘리면 jvm이 수행 할 수있는 방법을 생각할 수 있습니까? (문제가있는 것으로 가정하면)

+0

대상 OS (및 버전)는 무엇입니까?http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2007-02/msg00873.html –

+0

데비안을 보면 uname에서 제거 된 것으로 보입니다. 최신 안정됩니다. – Louis

답변

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 
} 

(신용 : this site를)

위의 패턴에 코드를 변경

그 상황을하는 데 도움이되는지 확인합니다.

+0

동일한 예외가 발생했음을 시도했습니다. – Louis

+0

몇 분 안에 내 대답을 확인했습니다. 확인을 위해 테스트를 기다리고 있습니다. – Louis

+0

솔루션에서 필요한만큼 대답을 선택했습니다. 내 게시물에 필요한 추가 줄이 포함되는지 확인하십시오. – Louis

0

파일을 닫지 않고 프로세스가 실제로 완료되는 것 같지 않습니다. 매우 큰 스레드에서 이런 일이 발생할 수 있습니까? 아니면 그들 중 일부는 실제로 완료되지 않습니다 (즉, 어떤 경우 waitFor에 매달리고 있습니다)?

그렇지 않으면 공개 파일 제한을 늘리는 데 어려움을 겪을 것입니다. 이것이 유닉스 계열 시스템이라고 가정하면 "ulimit"명령이 아마도 당신이 찾고있는 명령 일 것입니다.

+0

무제한으로 설정 : \ – Louis

0

JAVA 6을 사용하는 경우 File 객체에서 새 setter (읽기, 쓰기, 실행)를 시도해 볼 수도 있습니다. 느려질 수도 있지만 작동해야합니다.

6

도움 주셔서 감사합니다.이 때문에 다른 곳에서 벌어지는 별난 일을 처리해야합니다. 당신의 (인 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); 
    } 
} 

존 B 매튜스 post에서 아이디어를 얻었다.

+0

참고 : 여전히 waitFor를 사용하고 입력 스트림을 닫는 것이 좋지는 않지만 자바 인 것 같아요. – Louis

+1

좋은 catch, jim,하지만 여전히 'finally'에 문제가 있습니다. . 나는 당신이 각각의'close' 호출을 그들 자신의'catch'에서 가질 필요가 있다고 생각합니다. 그렇지 않으면'p.getInputStream.close()'를 할 때 예외가 발생하면 다른 것을 닫지 못할 것입니다. 문제는 지금 사라진 것처럼 보일 수 있지만 나중에 다시 올 수 있습니다. –

+0

좋은 지적. 덕분에 – Louis