Java

Runtime.exec()

_침묵_ 2006. 7. 8. 01:51

제목 : 자바에서 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