Java로 시스템 명령어 실행하기
본 포스팅은 Java로 시스템 명령어를 실행하는 방법에 대한 글입니다.
Java에서 시스템 명령어를 실행하려면 다음 두 가지 클래스 중 하나를 선택해서 사용하면 됩니다.
- java.lang.Runtime (JDK 1.4 이상)
- java.lang.ProcessBuilder (JDK 1.5 이상)
각 클래스를 통해 얻어지는 Process 객체는 JDK 에서 제공하는 외부 프로세스에 대한 접점으로서, 외부 명령어 실행을 가능하게 합니다.
Runtime 클래스를 통한 시스템 명령어 실행
private static void runTime() throws IOException {
// 운영체제 타입
String osType = System.getProperty("os.name");
// 명령어
String cmd = null;
// 윈도우 운영체제
if (osType.toLowerCase().startsWith("windows")) {
cmd = "cmd.exe /c dir";
// 그 외 운영체제
} else {
cmd = "sh -c ls";
}
// 명령어 실행
Process process = Runtime.getRuntime().exec(cmd);
// exec()의 매개변수로 String[]도 가능
// new String[] {"cmd.exe", "/c", "java", "-version"}
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
// 명령어 결과 출력
System.out.println(line);
}
}
ProcessBuilder를 통한 시스템 명령어 실행
ProcessBuilder는 directory() 메소드를 통해 작업 디렉토리를 지정할 수 있습니다.
private static void processBuilder() throws IOException {
String osType = System.getProperty("os.name");
String cmd = null;
// 윈도우 운영체제
if (osType.toLowerCase().startsWith("windows")) {
cmd = "cmd.exe /c dir";
// 그 외 운영체제
} 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("java");
// cmdArrList.add("-version");
// 명령어가 실행되는 작업 디렉토리를 사용자의 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);
}
}
파이프라인 사용 관련 이슈
파이프라인 사용 시, 해당 명령어를 하나의 문자열로 전달해야 명령어 실행 결과가 정상적으로 리턴됩니다.
docker ps | grep ‘hello’ 예시
// Runtime 예시 -----------------------------------------------------------------
Runtime.getRuntime().exec(new String[] {"sh", "-c", "docker ps | grep 'hello'"});
// 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);
이상으로 본 포스팅을 마치겠습니다.
Reference
- https://www.baeldung.com/run-shell-command-in-java
- https://ontoidea.tistory.com/86
- https://d2.naver.com/helloworld/1113548