excute shell command에 해당하는 글 1

java로 shell 명령어 실행하기, pipeline

IT기술/java, spring|2021. 1. 17. 16:19

2020-05-29 작성

 

java로 shell 명령어를 실행하는 방법은 2가지가 있다.
ProcessBuilder와 runtime.exec()를 사용하면 된다.

 

다음은 ProcessBuilder 예제이다. ProcessBuilder에 들어가는 명령어는 String[] 또는 List<String>여야 한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ProcessBuilderExample {
    public static void main(String[] args) {
        try {
            String[] command = new String[] {"bash","-c", "hdfs dfs -df | tail -n 1"};
            ProcessBuilder processBuilder = new ProcessBuilder(command);
            Process process = processBuilder.start();

            BufferedReader reader =
                    new BufferedReader(new InputStreamReader(process.getInputStream()));

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            int exitCode = process.waitFor();
            System.out.println("\nExited with error code : " + exitCode);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

다음은 runtime.exec() 예제이다. 위와 코드 내용은 2줄 빼고 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class RuntimeExecExample {
    public static void main(String[] args) {
        try {
            String[] command = new String[] {"bash","-c", "hdfs dfs -df | tail -n 1"};
            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader =
                    new BufferedReader(new InputStreamReader(process.getInputStream()));

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            int exitCode = process.waitFor();
            System.out.println("\nExited with error code : " + exitCode);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

명령어에 pipeline이 들어있을 때 실행이 안돼서 많이 헤멨는데,

위의 예제 처럼, shell(sh, bash)명령어 뒤에 pipeline이 있는 명령어를 한번에 써주니, 명령이 잘 실행됐다.

String[] cmd = {
"/bin/sh",
"-c",
"ls /etc | grep release"
};

 

참고사이트:
https://d2.naver.com/helloworld/1113548
https://mkyong.com/java/java-processbuilder-examples/
https://mkyong.com/java/how-to-execute-shell-command-from-java/
http://zetcode.com/java/processbuilder/
https://stackoverflow.com/questions/5928225/how-to-make-pipes-work-with-runtime-exec

댓글()