bash 쉘에서 명령을 실행하고 출력을 수집합니다. 그러나 첫 번째 읽기 이후 여러 출력 스트림이 작동하지 않고 "깨진 파이프" 예외가 발생하는 문제가 발생합니다.
1. ProcessBuilder 사용:
프로세스 교체 프로세스 = Runtime.getRuntime().exec("/bin/bash"); with:
ProcessBuilder builder = new ProcessBuilder("/bin/bash"); builder.redirectErrorStream(true); Process process = builder.start();
ProcessBuilder를 사용하면 표준 오류를 표준 출력으로 리디렉션할 수 있으므로 stderr 및 stdout에 대해 별도의 스레드가 필요하지 않습니다.
2. 출력 완료 대기:
출력 스트림(reader.readline())에서 읽는 루프는 프로세스가 종료되거나 파일 끝을 보낼 때까지 차단됩니다. 중단을 방지하려면 예상 출력이 수신된 경우에만 루프가 반복되는지 확인하세요.
3. "마법의 줄"을 사용하여 출력 끝 표시:
실행된 명령의 출력이 언제 완료되는지 확실하게 확인하려면 특정 줄을 작성하는 것이 좋습니다(예: "--EOF--"). 출력의 끝을 알리기 위해. 아래 코드 조각에 설명된 이 기술은 프로세스가 개행 문자로 종료되지 않는 시나리오를 처리하는 데 도움이 됩니다.
while (scan.hasNext()) { String input = scan.nextLine(); if (input.trim().equals("exit")) { writer.write("exit\n"); } else { writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n"); } writer.flush(); line = reader.readLine(); while (line != null && ! line.trim().equals("--EOF--")) { System.out.println("Stdout: " + line); line = reader.readLine(); } if (line == null) { break; } }
참고: 이 접근 방식을 사용하면 실행된 명령의 모든 출력이 보장됩니다. 다른 명령이 입력되기 전에 캡처됩니다. "깨진 파이프" 예외가 발생하지 않고 스레드 예약 작업에서 명령을 지속적으로 실행할 수 있습니다.
위 내용은 Bash 명령을 안정적으로 실행하고 Java에서 출력을 캡처하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!