자바스크립트가 비활성화 되어있습니다.
자바스크립트가 활성화 되어야 콘텐츠가 깨지지 않고 보이게 됩니다.
자바스크립트를 사용할수 있도록 옵션을 변경해 주세요.
- willbsoon

본문 바로가기
Java

Processbuilder 예시

by willbsoon 2021. 1. 12.

예시는 많은데 대화형 프로그램을 실행할 방법을 찾기 어려웠음.

ansible init.yml 실행하는데 hostname, ssh port, ssh id, pw 입력하는 방법을 찾고찾고 또 찾다가 이렇게 해결할수 있을듯 하여 써봄.

 

interactive 한 프로그램 사용할시 참고하세요~

 

    public void excute() throws NoPermissionException {
        String line;
        Scanner scan = new Scanner(System.in);

        ProcessBuilder builder = new ProcessBuilder("/bin/bash","./test.sh");

        builder.redirectErrorStream(true);

		// 작업할 디렉토리. test.sh가 이 위치에 있음.
        File workingDir = new File(
            "/home/ubuntu/projects/tmp_file");
        builder.directory(workingDir);
        try{
            System.out.println("program is started...");
            // 출력내용 로그찍기 
            Process process = builder
                .redirectOutput(new File(workingDir, "output.log"))
                .start();

            OutputStream stdin = process.getOutputStream ();
            InputStream stderr = process.getErrorStream ();
            InputStream stdout = process.getInputStream ();

            BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

            
            for (int i =0; i<4; i++){
            // 대화형 프로그램에서 입력 넣기 위함
                String input = scan.nextLine();
                if (input.trim().equals("exit")) {
                    // Putting 'exit' amongst the echo --EOF--s below doesn't work.
                    writer.write("exit\n");
                } else {
                    writer.write(input+"\n");
//                    writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
                }
                writer.flush();
            }
            // 프로그램이 실행이 끝난 후에 reader를 불러와서 출력내용을 콘솔에 뿌림
            // 중간중간 출력을 가져올수 없음...
            while (true) {
                line = reader.readLine();
                while (line != null && ! line.trim().equals("--EOF--")) {
                    System.out.println ("Stdout: " + line);
                    line = reader.readLine();
                }
                if (line == null) {
                    break;
                }
            }

        }catch (IOException e){
            e.printStackTrace();
        }

    }

 

 

참고)

몇가지 예제가 있음

zetcode.com/java/processbuilder/

 

대화형 쉘 프로그램에서 적용할 방법

qastack.kr/programming/3643939/java-process-with-input-output-stream

'Java' 카테고리의 다른 글

자바 제너릭 정리(url)  (0) 2021.02.19
JAVA json 받기  (0) 2021.02.18
자바 외부프로세스 실행시 주의점(url)  (0) 2020.12.29
log4j 설정. (url)  (0) 2020.11.12
java8 - ZonedDateTime 을 이용한 날짜 변환  (0) 2020.10.19

댓글