제목 : 자바에서 runtime.exec()를 사용해서 시스템명령어를 사용할때 에러
글쓴이:손님(guest) 2002/04/27 07:04:52 조회수:281 줄수:58
안녕하세여.제가 개발한 프로그램은 파일을 가지고 여러가지 작업을 하는 놈인데, 그래서 cp, mv, chmod같은 Unix명령어를 사용할 경우가 많습니다.원래 배치성 애플리케이션이라 한 놈만 떠서 작업하던 건데, 이번에 멀티로 떠서 작업하는 방식으로 변경했습니다. 그런데프로세스 하나로 떠서 작업할 때는 문제가 없었는데, 여러 프로세스로 떠서수행을 해보니 아래와 같은 에러가 나네여..
clFileManager.java(ERROR):cp
.........
~~
java.io.IOException: °ø°? º?w
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:54)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:551)
at java.lang.Runtime.exec(Runtime.java:418)
at java.lang.Runtime.exec(Runtime.java:361)
at java.lang.Runtime.exec(Runtime.java:325)
......
위 에러는 cp명령어를 사용할 때구여. chmod, mv, 모두 에러가 발생하네여물론 정상적으로 처리할 때도 있구여.. 모가 문제일지~~ 참고로 cp, chmod, mv, 구현한 소스는 아래와 같습니다. 애플리케이션에서는 clFileManager를 new로 생성해서 메소드를 콜하구 있구여..
public boolean cpFile(String fromPath, String toPath) {
String sCommand = "";
try {
Runtime rt = Runtime.getRuntime();
sCommand = "cp " + fromPath + " " + toPath;
rt.exec(sCommand);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
모 이런 방식인데여..음 모가 문제일까여? 물론 아래와 같은 방법은 해봤구여..
Processor p = rt.exec(~~);
p.waitFor();
...
(p.destroy() //<-- 요건 안해봤는뎅, 혹시 이렇게 사용하면 괜찮을까여? )
그럼 답변 부탁드립니다. 좋은 하루 보내세여~~
제목 : Re: [자답]runtime.exec();사용시 주의할 점
글쓴이:손님(guest) 2002/04/30 07:36:49 조회수:248 줄수:56
이거 찾느라고 하루를 꼬박 보냈내여~~
문제는 exec()를 날렸을 때 리턴되는 Process에 있었습니다. Process라는 객체는 inputStream, OutputStream, errorStream을 가지고 있더라구여.. 그니깐 각 해당 stream을 close시키지 않으면 요놈들이 계속 시스템 자원을 차지하고있어서 나중에 IOException을 발생시킵니다. 아래 소스를 가지고 테스트 하시면 바로 확인하실 수 있습니다. 역시 java관련된 q&a는 sun싸이트만한 곳이 없네여~~
그동안 sun싸이트는 다운받을 때만 이용했었는데, ㅋㅋ 앞으로 자주 이용해야 겠네여그럼 즐프~~
import java.lang.*;
import java.io.*;
public class runtimeTest {
public void changeFileMode(String sMode, String sPath) {
String sCommand = "";
try {
Runtime rt = Runtime.getRuntime();
sCommand = "chmod " + sMode + " " + sPath;
Process p = rt.exec(sCommand);// 아래부분을 주석처리 할 때와 안할때 차이가 있네여
p.getOutputStream().close(); // 각각의 스트림을 모두 close
p.getInputStream().close();
p.getErrorStream().close();// 여기까지
p.destroy(); // Process객체 destroy
} catch (IOException ie) {
ie.printStackTrace();
System.out.println("chmod Err : " + ie.getMessage());
} catch (Exception e) {
e.printStackTrace();
System.out.println("chmod Err : " + e.getMessage());
}
}
public static void main(String args[]) {
runtimeTest rTest = new runtimeTest();
for (int i = 1; i < 10000; i++) {
rTest.changeFileMode("755", "test.txt");
if (i % 100 == 0)
System.out.println("i번째 루프 : " + i);
}
System.out.println("Test end!!");
}
}
'Java' 카테고리의 다른 글
Sun Java Development Kit on FC5 (0) | 2006.08.29 |
---|---|
자바 2 SDK 1.5의「데드락 해결 비법」 (0) | 2006.07.07 |
JVM options (0) | 2006.06.23 |