본문 바로가기

Back

[Java] 시스템 명령어 실행하기

 

Java에서 시스템 명령어를 실행하기 위해 다음 두 가지 클래스를 사용할 수 있습니다.

 

  • java.lang.Runtime  (JDK 1.4 이상)
  • java.lang.ProcessBuilder (JDK 1.5 이상)  

 

각 클래스를 통해 얻어지는 Process 객체를 통해서 외부 프로세스에 접근할 수 있게 되고,

외부 명령어 실행이 가능하게 됩니다.

 

두 클래스 중 어느 것을 선택하면 좋을지에 대해선 ProcessBuilder가 단순히 명령어를 실행시키는 것 이외에 명령어가 실행되는 작업 디렉토리를 변경하는 등 다양한 설정이 가능하여 Runtime 보다 선호도가 높다고 하니 참고하시면 될 것 같습니다.

 

 

Runtime 클래스를 통한 시스템 명령어 실행

private static void runTime() throws IOException {

    // 운영체제 타입
    String osType = System.getProperty("os.name");

    // 명령어
    String cmd = null; 

    // 윈도우 운영체제 cmd.exe 사용
    if (osType.toLowerCase().startsWith("windows")) { 

        cmd = "cmd.exe /c dir";
		
    // 그 외 운영체제 sh 사용
    } else { 

        cmd = "sh -c ls";

    }

    // 명령어 실행
    Process process = Runtime.getRuntime().exec(cmd);
	// exec()의 매개변수로 String[]도 가능
    // new String[] {"cmd.exe", "/c", "dir"}
    // new String[] {"sh", "-c", "ls"}
    
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String line = null;

    while ((line = br.readLine()) != null) {

        // 명령어 결과 출력
        System.out.println(line);

    }

}

 

 

ProcessBuilder를 통한 시스템 명령어 실행 

private static void processBuilder() throws IOException {

    String osType = System.getProperty("os.name");

    String cmd = null; 

    // 윈도우 운영체제 cmd.exe 사용
    if (osType.toLowerCase().startsWith("windows")) { 

        cmd = "cmd.exe /c dir";

    // 그 외 운영체제 sh 사용
    } else { 

        cmd = "sh -c ls";

    }

    ProcessBuilder processBuilder = new ProcessBuilder(cmd);
	// 명령어를 ArrayList<String> 형태로 전달하는 것도 가능
    // ArrayList<String> cmdArrList = new ArrayList<>();
    // cmdArrList.add("sh");
    // cmdArrList.add("-c");
    // cmdArrList.add("ls");
    
    // 명령어가 실행되는 작업 디렉토리를 사용자의 home 디렉토리로 설정
    processBuilder.directory(new File(System.getProperty("user.home")));

    // 명령어 실행
    Process process = processBuilder.start();

    // 명령어 결과 read
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String line = null;

    while ((line = br.readLine()) != null) {

        // 명령어 결과 출력
        System.out.println(line);

    }

}

 

주의할 점

Runtime과 ProcessBuilder 모두 docker ps | grep 'hello' 와 같이 명령어에 파이프라인이 포함된 경우,

String[]이나 ArrayList<String>을 사용하여 "sh", "-c"를 추가한 뒤 실행할 명령어 부분은 분리하지 말고

하나의 문자열로 전달해야 명령어 실행 결과가 정상적으로 리턴됩니다. 

 

예)

// Runtime의 경우

Runtime.getRuntime().exec(new String[] {"sh", "-c", "docker ps | grep 'hello'"});


// ProcessBuilder의 경우

ArrayList<String> cmdArrList = new ArrayList<>();
cmdArrList.add("sh");
cmdArrList.add("-c");
cmdArrList.add("docker ps | grep 'hello'");

ProcessBuilder processBuilder = new ProcessBuilder(cmdArrList);

 

 

 

 

 

 

 

 

참고

 

https://yjkim97.tistory.com/70

 

[JAVA] java에서 shell command 실행

2021.11.24 SpringBoot 백엔드 서버에서 데이터베이스에 등록된 command를 실행하고 그 응답을 받아오는 기능을 구현하게 되었다. 본격적으로 구현하기에 앞서 어떻게 실행하고 결과를 받아오는지 한번

yjkim97.tistory.com

 

 

 

https://ontoidea.tistory.com/86

 

java로 shell 명령어 실행하기, pipeline

2020-05-29 작성 java로 shell 명령어를 실행하는 방법은 2가지가 있다. ProcessBuilder와 runtime.exec()를 사용하면 된다. 다음은 ProcessBuilder 예제이다. ProcessBuilder에 들어가는 명령어는 String[] 또는 List여야

ontoidea.tistory.com

 

 

https://d2.naver.com/helloworld/1113548

 

'Back' 카테고리의 다른 글

swagger 사용법  (2) 2024.10.21
Observer Pattern과 알림 시스템  (0) 2024.07.05
Trie 구조  (0) 2024.03.25
시스템 명령어로 도커 컨테이너의 리소스 사용 정보 구하기  (0) 2024.02.28
Prometheus Node Exporter 설치 방법  (0) 2024.01.22