상위 스크립트 종료 후에도 유지되도록 프로세스 교체를 통해 출력을 리디렉션하는 프로세스를 어떻게 설정합니까?
프로세스가 시작될 때 출력을 모니터링한 다음 프로세스가 정상적으로 계속될 수 있도록 프로세스를 해제하는 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 몇 줄을 작성하는 것입니다 .