뇌운동일지

[JAVA] java에서 shell command 호출 본문

JAVA

[JAVA] java에서 shell command 호출

purpleduck 2021. 3. 29. 14:46

원하는 것 

1. 파라미터로 shell command 받아오기 

2. 리턴값으로 command 결과 반환 

3. 실행 경로 지정 

4. 잘못된 shell command 입력 시, 에러메시지를 리턴해줄 것 

 

예제1) 

www.hanumoka.net/2020/07/01/java-20200701-java-shell-command/

Runtime 클래스와 ProcessBuilder 를 쓰는 방법 두가지가 있다. 

ProcessBuilder 사용을 선택. 

( 이 예제에서 Consumer<T> 쓰는 것을 명확히 이해하지 못함. )

-> 이 방법에서 입력을 인자값으로 받아오고, 출력을 return 값으로 반환하도록 처리하고자 했다. 


그래서 아래의 내용을 찾아보았다. 

 

BufferedReader to String 

stackoverflow.com/questions/15040504/how-to-easily-convert-a-bufferedreader-to-a-string

 

Thread 클래스 VS Runnable 인터페이스 : 전에 공부한 적이 있는데 까먹은 내용, 다음에 다시 살펴보자. 

자바에서 다중상속을 지원하지 않는 것과 관련이 있었던 것이 기억난다. 

 

threadpool 작업완료 시, return 하고 싶을 때 : run() 메소드는 return 값이 없다. 이것을 우회하여 처리결과를 return하고 싶어서 찾아본 내용. 

sas-study.tistory.com/232

 

리턴값을 반환하는 방법을 찾아보다가 Runnable 과 Callable 을 찾아봄 

스레드 풀에 대해 알아보게 됨. 

공유객체를 생성하여 Runnable 의 리턴값을 만드려는 방법에서 Callable 인터페이스를 사용하는 방법으로 바꾸기로 결정. 


ProcessBuilder 활용하여 java로 shell script 실행하는 예제 : 여기서는 thread pool 을 사용하지 않음. [예제1]과 접목하여 내가 이해할 수 있게 만들어보려고 함. 

krksap.tistory.com/1551

 

-> 이 방법 성공해서 이쁘게 HashMap에 담겨서 return 됨. MS-949로 인코딩


Quest2) 잘못된 명령어 입력 시, 오류메시지를 리턴해주도록 만들고자 했다. 

 

java로 shell command를 구현하기 위해서는 shell script 에 대한 개념을 속성으로 머리에 넣을 필요가 있었다. 

Shell Script 
쉘에서 사용할 수 있는 명령어 조합을 모아 만든 배치 파일 
리눅스에서는 여러 명령어들을 pipe, redirection, filter 등으로 연결하여 원하는 결과를 만들 수 있다. 
이렇게 묶여진 명령어 조합 반복 사용하는 것이 쉘 스크립트. 
쉘 스크립트 : 명령어 조합을 단일 명령어로 만들어 쉽게 사용하는 것 

shell : 운영체제의 커널과 사용자 사이를 이어주는 역할. 
shell은 사용자의 명령어 해석, 운영체제가 알아듣도록 지시. 
운영체제는 shell에게서 받은 지시를 해석하여 하드웨어를 위한 지시어로 바꾸어줌. 


Script : Interpreter 에 의해 해석/실행되는 프로그램 

 

ProcessBuilder 클래스 : 운영체제 프로세스 생성 시 사용 (JDK 7 이상) 

Runtime.exec() 의 경우, 표준 입력과 출력에서 제한된 버퍼 사이즈로 인해 하위 프로세스가 block 또는 데드락되는 문제가 있다. 

start() : 입력받은 커맨드 실행에 새로운 프로세스 생성


Process 클래스 : 실행하고자 하는 응용프로그램을 위한 프로세스 관리 

waitFor()  자식 프로세스가 종료될 때까지 기다림 

destroy() 부모 프로세스에서 자식 프로세스 강제 종료

 

해보면서 알게된 것 

Process 클래스 사용을 위해 Runtime 클래스를 사용할 것인지, ProcessBuilder 클래스를 사용할 것인지를 결정해야함. 

'JAVA' 카테고리의 다른 글

[JAVA] main method  (0) 2021.03.29
[JAVA17_(1)] this. 활용  (0) 2020.06.09
[JAVA26] ActionListener / WindowListener  (0) 2020.04.02
[JAVA25] sql  (0) 2020.04.01
[JAVA24] JAVA package 간단한 설명  (0) 2020.03.31
Comments