>Java >java지도 시간 >Bash 명령을 안정적으로 실행하고 Java에서 출력을 캡처하는 방법은 무엇입니까?

Bash 명령을 안정적으로 실행하고 Java에서 출력을 캡처하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-19 11:19:14672검색

How to Reliably Execute Bash Commands and Capture Their Output in Java?

Java에서 입력/출력 스트림을 사용하여 명령 실행

문제 개요

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;
    }
}

제한 사항

  • 해결책은 다음으로 제한됩니다. 사용자 입력을 기다리거나 개행 없이 출력을 생성하는 명령을 처리합니다.
  • 명령이 --EOF--를 출력한다고 가정합니다. line.
  • 작성된 명령에 괄호를 사용하면 bash에서 구문 오류가 발생할 수 있습니다.

참고: 이 접근 방식을 사용하면 실행된 명령의 모든 출력이 보장됩니다. 다른 명령이 입력되기 전에 캡처됩니다. "깨진 파이프" 예외가 발생하지 않고 스레드 예약 작업에서 명령을 지속적으로 실행할 수 있습니다.

위 내용은 Bash 명령을 안정적으로 실행하고 Java에서 출력을 캡처하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.