[ProcessBuilder] Spring(JAVA)에서 CMD 커맨드, 쉘 스크립트 등 외부 커맨드 실행
ProcessBuilder를 이용해서 JAVA 애플리케이션 혹은 Spring, Spring Boot 프레임워크에서 CMD를 통한 배치파일 실행이나 SH를 이용한 쉘 스크립트 등 외부 커맨드 파일을 실행하는 것을 간단하게 정리해보도록 하겠습니다.
JAVA ProcessBuilder 예제
JAVA의 ProcessBuilder를 활용하여 다른 외부 프로세스를 실행시키거나 컨트롤을 할 수 있는데, 특히 윈도우의 CMD나 리눅스의 SH를 이용하여 사전에 작성한 배치 파일이나 쉘 스크립트 파일을 실행하여, 컴퓨터나 서버에 커맨드를 실행시켜 다양한 기능을 구현할 수 있습니다. Spring이나 Spring Boot 애플리케이션에서 OS에 커맨드를 날려서 현재 서버의 정보를 가져온다던지, Git 같은 커맨드 라인에서 동작하는 다른 외부 프로그램을 실행하는 등의 다양한 기능 구현이 가능합니다.
아래와 같이 간단하게 예제를 작성해보면, 먼저 ProcessBuilder에 cmmand 매서드를 통해 미리 작성한 배치파일이나 쉘 스크립트 파일을 실행하는 명령을 정의합니다. 다음으로 start() 매서드를 통해 프로세스를 실행합니다. 실행하면서 발생하는 Console Output을 getInputStream()을 통해 BufferedReader 객체로 받은 다음에 로그로 출력하고, 마지막으로 destroy() 메서드를 통해 프로세스를 파기하는 예제입니다.
- ProcessBuilderTest.java
public class PBTest {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder builder = new ProcessBuilder();
builder.command("cmd.exe", "/c", ".\\test.bat"); // Windows OS
// builder.command("sh", "-c", "/home/test.sh"); // Linux OS
Process process = builder.start();
BufferedReader br = new BufferedReader(new InputStreamReader( process.getInputStream() ));
String line = null;
while( (line = br.readLine()) != null ){
System.out.println(line);
}
if(process != null) {
process.destroy();
}
}
}
배치파일 혹은 쉘스크립트파일을 어떻게 작성하느냐에 따라 다양하게 활용이 가능한데 만약 test.bat 윈도의 배치파일을 아래와 같이 작성을 했다고 하면, 자바에서 현재 CPU 사용률을 불러오거나 git 명령어를 통해 특정 git의 pull을 날리던지, git log 혹은 git grep 등의 명령어로 다양한 정보를 가져올 수 있습니다.
- test.bat
@echo off
echo ==process bulider test==
echo --CPU loadpercentage:
wmic cpu get loadpercentage
echo --Git Log:
git -C "C:\dev\gittest" log
위의 예제를 실행을 하면, 아래와 같이 현재 CPU 사용률과 Git log를 콘솔 로그에 출력하는 것을 확인할 수 있습니다.