본문 바로가기

Language/JAVA

Java(Spring)로 Shell Script실행 하기

728x90

Java(Spring)로 Shell Script실행 하기

백엔드를 하다보면 shell script를 쓸 일이 자연스럽게 많이 생깁니다.

제가 만든 프로그램을 배포할려면 서버 구성부터 띄우고 올리고 내리고 재부팅하고 등등 이걸 다 손으로 하자니 손이 너무 많이 가는데 나름 루틴한 작업들이 많습니다.

손으로 하는 작업을 반자동화라도 하기 위해 shell script를 쓰는데 쉘 스크립트를 실행 하려면 ssh로 들어가서 커맨드를 입력 해주어야 합니다.

하지만 ssh접속하고 로그인 하는 것도 일이기 때문에 api를 뚫어놓고 호출하는 방식으로 해결하고 싶다는 생각이 들었습니다.

자바에 찾아봤더니 해당 기능이 있었습니다. ProcessBuilder를 이용합니다.


ShRunner.java

public class ShRunner {
public Map execCommand(String... str) {
Map<Integer, String> map = new HashMap<>();
ProcessBuilder pb = new ProcessBuilder(str);
pb.redirectErrorStream(true);
Process process = null;
try {
process = pb.start();
} catch (IOException e) {
e.printStackTrace();
}

BufferedReader reader = null;
if (process != null) {
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
}

String line;
StringBuilder stringBuilder = new StringBuilder();
try {
if (reader != null) {
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
}
} catch (IOException e) {
e.printStackTrace();
}

try {
if (process != null) {
process.waitFor();
}
} catch (InterruptedException e) {
e.printStackTrace();
}

if (process != null) {
map.put(0, String.valueOf(process.exitValue()));
}

try {
map.put(1, stringBuilder.toString());
} catch (StringIndexOutOfBoundsException e) {
if (stringBuilder.toString().length() == 0) {
return map;
}
}
return map;
}
}

public class ShRunnerTest {

ShRunner shRunner = new ShRunner();

@Test
public void name() throws IOException, InterruptedException {
String cmds = "sh /Users/Kyeongrok/hello.sh";
String[] callCmd = {"/bin/bash", "-c", cmds};
Map map = shRunner.execCommand(callCmd);

System.out.println(map);
}
}

실행은  위와 같이 ProcessBuilder pb = new ProcessBuilder(str);를 이용 하면 됩니다.

위 test code는 home에 hello.sh가 있으면 실행하는 명령입니다. 제 노트북의 홈은 /Users/Kyeongrok입니다. cd ~ 를 치면 pwd를 했을때 나오는 주소를 이용했습니다.

여기에 hello.sh가 있으면 실행되고 없으면 에러메세지가 나옵니다.



728x90
블로그 주인장입니다. 원하시는 정보는 얻으셨나요? 이 포스트에서 추가로 필요한 정보가 있으시면 여기에 남겨주세요.