예시는 많은데 대화형 프로그램을 실행할 방법을 찾기 어려웠음.
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 |
댓글