OS : CentOS 7
Java 프로그램을 사용해서 리눅스 명령어를 실행하고, 결과 값을 받기위해서 테스트 프로그램을 작성했다.
import java.io.*;
import java.util.*;
class Exec {
public static void main(String[] args) throws IOException, InterruptedException{
String command = "top -n 1 | grep -i cpu\\(s\\) | awk '{print $2}'";
int lineCount = 0;
String line = "";
Runtime rt = Runtime.getRuntime();
Process ps = null;
try {
ps = rt.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(new SequenceInputStream(ps.getInputStream(), ps.getErrorStream())));
String result_str = "";
while((line = br.readLine()) != null) {
result_str += line;
}
System.out.println(result_str);
br.close();
} catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
}
쉘에서 잘 되던 명령어가 먹히질 않았다.
결론적으로 '|' <--- 리다이렉션 문자는 쉘에서 적용된다는 것( <, >> 등)
쉘로 동작하게 명령어를 추가해야된다는 것이다.
import java.io.*;
import java.util.*;
class Exec {
public static void main(String[] args) throws IOException, InterruptedException{
String command = "top -n 1 | grep -i cpu\\(s\\) | awk '{print $2}'";
String[] commands = {"/bin/sh", "-c", command}; // <---추가
int lineCount = 0;
String line = "";
Runtime rt = Runtime.getRuntime();
Process ps = null;
try {
ps = rt.exec(commands); // <---수정
BufferedReader br = new BufferedReader(new InputStreamReader(new SequenceInputStream(ps.getInputStream(), ps.getErrorStream())));
String result_str = "";
while((line = br.readLine()) != null) {
result_str += line;
}
System.out.println(result_str);
br.close();
} catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
}
top 명령어에서 예상치 못하게 다음과 같은 에러가 발생했다.
top: failed tty get <<
-b 옵션을 붙이는 것으로 해결 - 참고사이트
String command = "top -n 1 -b | grep -i cpu\\(s\\) | awk '{print $2}'"