티스토리 뷰

자바(Java)

자바 리눅스 쉘 실행 -2

xemaker 2020. 1. 22. 15:44

앞에 글에서 명령어를 파라미터로 받으면 어떤 명령어 이던지 실행이 가능 하니 파라미터로 받는것을 해보겠다.

사실 어렵지 않고 간단하다.

메인 메소드에

if(args.length==0){
System.out.println("파라미터를 입력하세요.");
}else{
String para=args[0];
Exe.execute(para);
}

이 부분만 추가했다. 그럼 전체 소스를 살펴보자.

public class Exe {
 
    public static void main(String[] args) {
       if(args.length==0){
			System.out.println("파라미터를 입력하세요.");
		}else{
			String para=args[0];
			Exe.execute(para);
		}
    }
 
    /**
     * cmd 명령어 실행
     *
     * @param cmd
     */
    public static void execute(String cmd) {
        Process process = null;
        Runtime runtime = Runtime.getRuntime();
        StringBuffer successOutput = new StringBuffer(); // 성공 스트링 버퍼
        StringBuffer errorOutput = new StringBuffer(); // 오류 스트링 버퍼
        BufferedReader successBufferReader = null; // 성공 버퍼
        BufferedReader errorBufferReader = null; // 오류 버퍼
        String msg = null; // 메시지
 
        List<String> cmdList = new ArrayList<String>();
 
        // 운영체제 구분 (window, window 가 아니면 무조건 linux 로 판단)
        if (System.getProperty("os.name").indexOf("Windows") > -1) {
            cmdList.add("cmd");
            cmdList.add("/c");
        } else {
            cmdList.add("/bin/sh");
            cmdList.add("-c");
        }
        // 명령어 셋팅
        cmdList.add(cmd);
        String[] array = cmdList.toArray(new String[cmdList.size()]);
 
        try {
 
            // 명령어 실행
            process = runtime.exec(array);
 
            // shell 실행이 정상 동작했을 경우
            successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
 
            while ((msg = successBufferReader.readLine()) != null) {
                successOutput.append(msg + System.getProperty("line.separator"));
            }
 
            // shell 실행시 에러가 발생했을 경우
            errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
            while ((msg = errorBufferReader.readLine()) != null) {
                errorOutput.append(msg + System.getProperty("line.separator"));
            }
 
            // 프로세스의 수행이 끝날때까지 대기
            process.waitFor();
 
            // shell 실행이 정상 종료되었을 경우
            if (process.exitValue() == 0) {
                System.out.println("성공");
                System.out.println(successOutput.toString());
            } else {
                // shell 실행이 비정상 종료되었을 경우
                System.out.println("비정상 종료");
                System.out.println(successOutput.toString());
            }
 
            // shell 실행시 에러가 발생
            if (errorOutput.toString().length()>0) {
                // shell 실행이 비정상 종료되었을 경우
                System.out.println("오류");
                System.out.println(successOutput.toString());
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                process.destroy();
                if (successBufferReader != null) successBufferReader.close();
                if (errorBufferReader != null) errorBufferReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
 
}

그런데 윈도우에서는 잘 출력이 되는데 리눅스에서 실행하면 결과 출력되는 여러줄 중에 맨 마지막 줄만 출력되거나 출력이 되지 않는다. 실행은 된다. 개행문자 차이(?) 같은 느낌이 드는데 아시는 분은 댓글을 달아주면 감사하겠습니다~~

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함