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}'"