스크립트가 끝난 후에도 프로세스가 계속되도록 bash에서 프로세스 교체 후 프로세스의 파이프를 어떻게 설정합니까?

스크립트가 끝난 후에도 프로세스가 계속되도록 bash에서 프로세스 교체 후 프로세스의 파이프를 어떻게 설정합니까?

상위 스크립트 종료 후에도 유지되도록 프로세스 교체를 통해 출력을 리디렉션하는 프로세스를 어떻게 설정합니까?

프로세스가 시작될 때 출력을 모니터링한 다음 프로세스가 정상적으로 계속될 수 있도록 프로세스를 해제하는 Bash 스크립트를 설정하려고 합니다. (이것을 다른 스크립트 내에서 호출하여 시작될 때까지 추가 실행을 차단하고 싶습니다. 수행).

http.server이제 이 모듈을 테스트 사례로 사용하고 있습니다 . 아래 코드는 Python 모듈을 올바르게 시작하고 요청에 대한 출력을 확인한 GET다음 종료됩니다. 그러나 종료되면 프로세스 http.server도 종료됩니다. Bash가 종료된 후에도 이 프로세스를 유지하려면 어떻게 해야 합니까?

exec 3< <(python3 -u -m http.server 2>&1 )
while true; do
        read -t 2 line
        echo "reading..."
        echo "$line"
        if [[ "$line" =~ .*GET.* ]]; then
            break
        fi
done <&3

bash가 종료될 때 파일 설명자가 닫히고 3출력 파일이 닫히는 것을 볼 때 Python이 종료되기 때문에 프로세스가 죽어가고 있다고 생각합니다. 다양한 리디렉션을 시도했지만 3소용이 없었습니다. 프로세스가 생존하려면 프로세스의 다른 부분을 수정해야 합니까? 기본적으로 나는 를 실행하는 것과 동일 python3 -u -m http.server 2>&1 &하지만 프로세스가 처음 시작될 때 프로세스의 출력을 일시적으로 모니터링할 수 있기를 원합니다.

답변1

Bash 스크립트에서 하위 프로세스(Python 프로그램 실행)를 시작하고 여기에서 Bash 스크립트로의 파이프를 만듭니다.

Bash 스크립트가 종료된 후에는 읽기 위해 파이프를 여는 프로세스가 더 이상 없습니다. 따라서 다음에 Python 스크립트가 파이프에 쓸 때 SIGPIPE 신호를 수신하고 종료됩니다. 표준 오류 대신 표준 출력만 파이프로 리디렉션하면 결과 오류가 표시됩니다.

Python 스크립트가 SIGPIPE 신호를 무시하더라도 파이프에 쓰기가 실패하여 예외가 발생하므로 파이프에 쓸 때 여전히 종료됩니다.

서버가 준비되었음을 알리는 줄만 보거나 첫 번째 요청에 대한 줄까지 보고 싶다면 간단한 방법은 리더를 실행 상태로 두는 것입니다.

exec 3< <(python3 -u -m http.server 2>&1 )
{ while true; do
  done;
  exec cat;
} <&3

오류 메시지를 무시하는 대신 표준 오류를 로그 파일 어딘가로 리디렉션할 수 있습니다.

BaseHTTPRequestHandler.log_request또 다른 접근 방식은 처음으로 로그 항목만 내보내도록 메서드를 재정의하는 Python 몇 줄을 작성하는 것입니다 .

관련 정보