파이프가 가끔 '막히는' 이유: 버퍼링 노트

파이프가 가끔 '막히는' 이유: 버퍼링

"버퍼링은 터미널 프로그램에서 성능을 개선하기 위해 출력을 그룹화하는 일반적인 방법입니다. 일정한 크기 임계값에 도달할 때까지 출력을 버퍼링합니다. 이렇게 하면 파이프에 데이터가 느리게 추가되는 경우 문제가 발생할 수 있습니다. 프로그램이 출력을 버퍼링하고 이를 작성하지 않을 수 있습니다.Grep 및 유사한 프로그램은 파이프에 쓰일 때 블록 버퍼링을 기본적으로 사용하지만 터미널에 쓰일 때는 라인 버퍼링을 사용합니다. 따라서 "tail -f /some/log/file | grep thing1 | grep thing2" 명령어가 출력을 표시하지 않는 이유를 설명합니다.grep, sed, awk, tcpdump, jq와 같은 명령어는 출력을 버퍼링합니다. 반면 tail, cat, tee와 같은 명령어는 버퍼링하지 않습니다.C, Python, Ruby, Perl과 같은 프로그래밍 언어도 출력을 버퍼링할 수 있습니다. 이러한 버퍼링을 비활성화하는 다양한 방법이 있습니다.파이프에서 Ctrl-C를 누르면 프로그램의 출력 버퍼가 손실될 수 있습니다. 신호가 버퍼가 플러시되기 전에 수신되기 때문입니다.파일로 리디렉션할 때도 버퍼링이 발생하지만 일반적으로 예상대로 작동합니다. 프로그램이 종료되기 전에 버퍼의 내용이 작성됩니다.버퍼링을 피하려면 프로그램이 빠르게 끝나는지 확인하거나 grep에서 "--line-buffered" 플래그를 사용할 수 있습니다. 명령어를 awk로 다시 작성하거나 stdbuf를 사용하여 프로그램이 터미널에 쓰이는 것처럼 작동하게 할 수도 있습니다. unbuffer를 사용하여 프로그램이 일관된 동작을 수행하게 할 수도 있습니다.이deal한 솔루션은 특정 상황에 따라 다르며 unbuffer가 일관된 동작을 제공하는 신뢰할 수 있는 선택입니다.버퍼링은 일반적으로 문제가 되지 않지만 파이프에 데이터가 느리게 추가되는 경우 발생할 수 있습니다. 버퍼링을 비활성화하는 환경 변수가 있으면 유용할 수 있지만, 설계 및 구현에는 도전이 있습니다."