장기 실행 스크립트가 출력을 파일로 보내는 것을 중지합니다.

장기 실행 스크립트가 출력을 파일로 보내는 것을 중지합니다.

10초 간격으로 서버의 일부 상태를 캡처하는 스크립트가 있습니다.

스크립트는 다음과 같습니다.

for (( ; ; ))
do
    /usr/local/apache/bin/apachectl fullstatus
    sleep 10
done

다음 명령을 사용하여 스크립트를 실행하고 있습니다.

nohup /path/to/scriptname.sh | gzip > logfile.log.gz &

SSH 연결을 끊으면 백그라운드에서 실행되고 계속 실행됩니다. 그러나 약 3~4시간이 지나면 출력이 로그 파일로 전송되지 않습니다. 스크립트는 여전히 실행 중이며 ps -elf | grep scriptname을 실행하면 표시되지만 로그 파일은 업데이트되지 않습니다. 출력 전송이 중지되는 이유는 무엇입니까? 버퍼 문제일까요?

답변1

파일 gzip형식에는 CRC-32 체크섬과 압축되지 않은 데이터 길이가 포함된 8바이트 바닥글이 있습니다. 이것압축 파일 형식블록 지향적입니다. 파이프라인의 프로그램은 gzip다음 출력 블록에서 사용하기 위해 입력을 거의 확실하게 버퍼링합니다. 8바이트 바닥글은 장기 실행 쉘 스크립트가 종료 gzip되고 stdin이 닫힐 때까지 기록되지 않습니다. DEFLATE 블록이 로그 파일에 정기적으로 기록되지 않는지 확인하려면 오랜 시간을 기다려야 할 것 같습니다.

관련 정보