자바(Java)
자바 리눅스 쉘 실행 -2
xemaker
2020. 1. 22. 15:44
앞에 글에서 명령어를 파라미터로 받으면 어떤 명령어 이던지 실행이 가능 하니 파라미터로 받는것을 해보겠다.
사실 어렵지 않고 간단하다.
메인 메소드에
if(args.length==0){
System.out.println("파라미터를 입력하세요.");
}else{
String para=args[0];
Exe.execute(para);
}
이 부분만 추가했다. 그럼 전체 소스를 살펴보자.
public class Exe {
public static void main(String[] args) {
if(args.length==0){
System.out.println("파라미터를 입력하세요.");
}else{
String para=args[0];
Exe.execute(para);
}
}
/**
* cmd 명령어 실행
*
* @param cmd
*/
public static void execute(String cmd) {
Process process = null;
Runtime runtime = Runtime.getRuntime();
StringBuffer successOutput = new StringBuffer(); // 성공 스트링 버퍼
StringBuffer errorOutput = new StringBuffer(); // 오류 스트링 버퍼
BufferedReader successBufferReader = null; // 성공 버퍼
BufferedReader errorBufferReader = null; // 오류 버퍼
String msg = null; // 메시지
List<String> cmdList = new ArrayList<String>();
// 운영체제 구분 (window, window 가 아니면 무조건 linux 로 판단)
if (System.getProperty("os.name").indexOf("Windows") > -1) {
cmdList.add("cmd");
cmdList.add("/c");
} else {
cmdList.add("/bin/sh");
cmdList.add("-c");
}
// 명령어 셋팅
cmdList.add(cmd);
String[] array = cmdList.toArray(new String[cmdList.size()]);
try {
// 명령어 실행
process = runtime.exec(array);
// shell 실행이 정상 동작했을 경우
successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
while ((msg = successBufferReader.readLine()) != null) {
successOutput.append(msg + System.getProperty("line.separator"));
}
// shell 실행시 에러가 발생했을 경우
errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
while ((msg = errorBufferReader.readLine()) != null) {
errorOutput.append(msg + System.getProperty("line.separator"));
}
// 프로세스의 수행이 끝날때까지 대기
process.waitFor();
// shell 실행이 정상 종료되었을 경우
if (process.exitValue() == 0) {
System.out.println("성공");
System.out.println(successOutput.toString());
} else {
// shell 실행이 비정상 종료되었을 경우
System.out.println("비정상 종료");
System.out.println(successOutput.toString());
}
// shell 실행시 에러가 발생
if (errorOutput.toString().length()>0) {
// shell 실행이 비정상 종료되었을 경우
System.out.println("오류");
System.out.println(successOutput.toString());
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
process.destroy();
if (successBufferReader != null) successBufferReader.close();
if (errorBufferReader != null) errorBufferReader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
그런데 윈도우에서는 잘 출력이 되는데 리눅스에서 실행하면 결과 출력되는 여러줄 중에 맨 마지막 줄만 출력되거나 출력이 되지 않는다. 실행은 된다. 개행문자 차이(?) 같은 느낌이 드는데 아시는 분은 댓글을 달아주면 감사하겠습니다~~