2011-06-14 3 views
3

Linux bash 스크립트를 작성하고 실행 권한을 추가하고 실행하려고하는 chmod를 실행하는 Java 코드가 있습니다. 오류 = 26, 텍스트 파일 사용 중이라는 프로세스가 시작될 때 IOException이 발생합니다. 파일 작성이 완료되고 스트림이 닫혔 음을 확인했습니다. chmod는 정상적으로 작동하지만이 오류가 계속 발생합니다.java 실행중인 bash 스크립트, error = 26 텍스트 파일 사용 중

디버거를 실행하고 코드를 단계별로 실행하면 오류가 발생하지 않으므로 타이밍 문제가 있음을 알았습니다. bash 스크립트를 실행하기 전에 chmod가 완료되었는지 어떻게 확인할 수 있습니까? Thread.sleep (10000)을 추가하는 것과 같이 신뢰할 수없는 솔루션을 피하고 싶습니다. 성공할 때까지 루프를 시도하고 try/catch 블록에 실행을 넣는 것과 같은 "해킹"을 들려줍니다.

나는 등을 듣고 스레드와 프로세스의 시작을 포장 코드의 상당한 양의가 있지만 여기가 무엇을하고 있는지의 단순화 된 버전입니다 (이 코드도 시도는 그것은 같은 결과가) :

String[] cmd1 = {"/bin/chmod", "750", postFile }; 
new ProcessBuilder(cmd1).redirectErrorStream(true).start().waitFor(); 
String[] cmd2 = { postFile }; 
new ProcessBuilder(cmd2).redirectErrorStream(true).start().waitFor(); 

실행 후 "postFile"에는 올바른 750 개의 사용 권한이 있지만 실행되지 않았습니다 (IOException 때문에).

+1

코드가 있습니까? 당신이 당신의 chmod를 실행하는 것처럼? 감사합니다 – talnicolas

+0

파일을 여러 위치에서 열지 않았는지 다시 확인하십시오. –

+0

감사합니다. 나는 똑같은 문제가 있었는데 파일을 열었지만 닫지 않은 수업은 완전히 무관하고 처분되었다. – AdamOutler

답변

4

다음 오류를 담당하는 chmod가 맞습니까? 실행하려고하기 전에 출력 파일을 닫으십시오.

당신은 내가 chmod를 그 오류가 발생할해야하는 이유 손실에있어 닫습니다, 그러나 당신은 스크립트를 실행하는 쉘을 사용하여 chmod를 실행할 필요가 피할 수있는 경우 :

String[] cmd = {"bash", postfile };

+0

당신의 제안을 시도 "문자열 [] cmd2 = {"/ bin/sh ","-c ", postFile}; 나는 같은 오류가 발생합니다. – Jared

+0

네가 옳았다. 내가 파일을 압축 해제하는 데 사용했던 클래스가 스트림을 닫지 않았어. – Jared

0

관련이 있는지 알 수는 없지만 일반적으로 ErrorStream과 InputStream을 가져 오거나 리디렉션해야합니다 (일반적으로 생성 한 ResponseStreamReader에서 리디렉션 선택에 대해 알지 못합니다).

+0

나는 그것을하기위한 코드와 듣고있는 별도의 스레드를 가지고있다. 전체 클래스를 사용하기 때문에 코드의 단순화 된 버전 만 게시했습니다. 참고로, 나는 단순화를 위해 출력 스트림으로 오류를 리디렉션합니다. – Jared

2

을 나중에 참조를 들어,이 특별한 경우 닫히지 않은 스트림에 의해 발생했을 수 있지만, 바로 파일을 실행하여 다음 파일에 대한 사용 권한을 설정하면 너무이 오류가 발생할 수 있습니다

java.io.IOException: Cannot run program "...": error=26, Text file busy 

는 그것은 probable bug in JDK이다. 필자의 경우 스크립트 파일을 편집하는 사람이 없더라도이 코드 스 니펫으로 인해 발생했습니다.

관련 문제