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 |