본문으로 바로가기

java(spring)로 shell script실행 하기

category Language/JAVA 2019.03.05 12:16

java(spring)로 shell script실행 하기

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

내가 만든 프로그램을 배포할려면 서버 구성부터 띄우고 올리고 내리고 재부팅하고 등등 이걸 다 손으로 하자니 손이 넘 많이 간다.

그래서 shell script를 쓰는데 쉘 스크립트를 실행 하려면 ssh로 들어가서 커맨드를 날려줘야 한다.

하지만 여기 들어가는 것도 일이라서 api를 뚫어놓고 호출하는 방식으로 해결하고 싶은 것이다.

자바에 찾아봤더니 해당 기능이 있다.


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);
}
}

 실행은 위와 같이 하면 된다.

home에 hello.sh가 있으면 실행하는 명령이다. 내 노트북의 홈은 /Users/Kyeongrok이다. cd ~ 를 치면 이동하는 곳이 홈이다.

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

end.




댓글을 달아 주세요