Skip to content

Commit

Permalink
update: Transient Process - 실행 예외 처리 로직 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
inferior3x committed Dec 18, 2024
1 parent 1948914 commit 1bd8a94
Showing 1 changed file with 20 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;

//실행 후 종료되어 모든 출력을 얻는 프로세스
//출력 스트림을 통한 프로세스와의 상호작용은 없다.

@Slf4j
public class TransientProcess {

protected BufferedReader br;
Expand All @@ -28,7 +29,7 @@ public TransientProcess(String command){
.redirectErrorStream(true)
.start();
} catch (IOException e) {
throw new RuntimeException(command+" - 알 수 없는 원인으로 실행에 실패했습니다.");
throw new RuntimeException("[Transient Process] " + command + " : 실행 실패");
}
this.br = new BufferedReader(new InputStreamReader(process.getInputStream()));
this.ebr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
Expand All @@ -39,19 +40,28 @@ public TransientProcess(String command){
// IOException을 여기서 처리하므로 무조건 실행되어야 하는 명령어는 사용하면 안된다!
public TransientProcess(String sudoCommand, String sudoPassword) {
this(sudoCommand);
/*
output stream에 쓰기 전에 종료될 가능성이 있는 경우
1. sudo로 실행을 안했을때
2. (리눅스) groups에 포함된 사용자로 실행했을 때
*/
if (!this.process.isAlive()) return;
Writer writer = new OutputStreamWriter(this.process.getOutputStream());
try {
/*
writer를 통해 password를 입력하기 전에 프로세스가 종료됐을경우 예외가 뜬다.
프로세스가 빨리 끝나는 두 가지 경우의 수가 있다. (정상적인 상황이라고 가정)
1. sudo로 실행을 안했을때
2. (리눅스) groups에 포함된 사용자로 실행했을때
이를 아래에서 catch한다.
*/
writer.write(sudoPassword + System.lineSeparator());
writer.flush();
} catch (IOException e) {
//TODO: 에러 스트림 띄우는거 실험용임 꼭 제거하기
throw new RuntimeException(sudoCommand + " - sudo 명령어 입력 중 오류 발생: \n" + errorResultString());
if (e.getMessage().contains("Broken pipe") && //프로세스가 종료됐거나 연결이 끊겨서 발생한 예외인지
!this.process.isAlive() && //프로세스가 종료됐는지
this.process.exitValue() == 0 //프로세스가 정상적으로 종료됐는지
) {
//정상적으로 실행됐다고 판단하여 warn 로깅
log.warn("[Transient Process] {} : sudo 비밀번호 입력 전에 프로세스 종료됨", sudoCommand);
return;
}
//이외는 예외를 띄운다.
throw new RuntimeException("[Transient Process] " + sudoCommand + " : sudo 명령어 입력 중 오류 발생" + "\ninput stream:" + resultString() + "\nerror stream:" + errorResultString());
}
}

Expand Down

0 comments on commit 1bd8a94

Please sign in to comment.