두 번째 파이프가 첫 번째 파이프가 완료될 때까지 기다리지 않도록 설정

두 번째 파이프가 첫 번째 파이프가 완료될 때까지 기다리지 않도록 설정

호출되는 장기 실행 프로그램이 있고 my-programstdout에서 로그를 보고 파일에도 저장하고 싶습니다. 또한 각 행 앞에 날짜 시간을 추가하고 싶습니다.

이것이 내가하려는 일입니다.

my-program | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | tee out.log

문제는 두 번째 파이프가 첫 번째 파이프의 출력이 완료될 때까지 기다린다는 것입니다.

왜 기다려? 첫 번째 파이프의 출력을 한 줄씩 처리하도록 하려면 어떻게 해야 합니까?

감사해요

답변1

파이프가 있으면 애플리케이션이 출력을 보다 효율적으로 버퍼링할 수 있습니다. 두 번째(및 세 번째) 프로세스는 첫 번째 프로세스와 병렬로 실행되지만 첫 번째 프로세스는 버퍼를 채울 만큼 충분한 출력을 생성하지 못할 수 있습니다.

를 사용하여 이 문제를 해결할 수 있지만 stdbuf출력을 완전히 버퍼링하기보다는 라인 버퍼링하도록 강제하기 때문에 모든 파이프에 대한 보편적인 만병통치약으로 권장하지는 않습니다.

stdbuf -oL my-program | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | tee out.log

stdbuf -oLtoo 앞에 하나를 추가 할 수도 있습니다 awk. 먼저 사용하지 않고 시도하고 필요한 경우 추가하세요.

관련 정보