"stdbuf" 접두사가 필요한 명령은 무엇입니까?

"stdbuf" 접두사가 필요한 명령은 무엇입니까?

오랫동안 실행되는 Bash 명령 파이프라인이 있는 경우 I/O 버퍼링으로 인해 생명의 징후가 전혀 보이지 않는 경우가 많습니다. 버퍼링을 비활성화하는 것이 가능하다는 것을 온라인에서 찾았습니다 stdbuf. 표시된 예여기예:

tail -f access.log | stdbuf -oL cut -d aq aq -f1 | uniq

그러나 파이프라인에서 어떤 명령에 command 접두사를 붙여야 하는지는 확실하지 않습니다 stdbuf. 그래서 모든 명령에 추가합니다. 버퍼링 없이 다음을 수행할 수 있습니다.

cd ~/tmp
stdbuf -i0 -o0 -e0 find /i \! -type d | \
stdbuf -i0 -o0 -e0 sed -u -n -e \
's=.*\<\(\([A-Z_a-z0-9.-]\+\)/\2/\).*=& \1=p' \
2>&1 | stdbuf -i0 -o0 -e0 tee find.out

이로 인해 내 코드는 인지적인 측면에서 매우 시끄러워집니다.

접두사가 필요한 명령을 결정하는 방법은 무엇입니까 stdbuf?

답변1

"라이브" 출력을 볼 수 없는 문제는 stdout의 출력 버퍼링입니다. 입력 버퍼링은 문제가 되지 않으며 표준 오류는 기본적으로 버퍼링되지 않습니다. 따라서 삭제 -i0-e0옵션을 설정할 수 있습니다. 입력 버퍼링을 비활성화하면 프로그램 속도가 느려질 수 있으므로 실제로는 비생산적일 수 있습니다.

그렇다면 문제는 글쓰기를 다루는 것이기 때문에와는 별개로터미널에서 파이프의 마지막 명령은 일반적으로 출력을 버퍼링하지 않습니다. (출력을 파일로 리디렉션하고 다른 프로그램을 통해 파일을 보는 경우는 제외됩니다.)

그런 다음 GNU grep에 있는 것처럼 프로그램에 버퍼링을 비활성화하는 전용 옵션이 있는 경우 그 이상의 옵션을 grep --line-buffered사용할 이유가 없습니다 . 또한 GNU sed에서 버퍼링을 비활성화하는 것을 의미합니다. 또한 실시간으로 보는 것이 중요하므로 출력을 버퍼링하지 않습니다.stdbufsed -utail -f

그래서 저는 이것이 다음과 같이 해야 한다고 생각합니다:

stdbuf -o0 find /i \! -type d | \
 sed -u -n -e 's=.*\<\(\([A-Z_a-z0-9.-]\+\)/\2/\).*=& \1=p' 2>&1 | \
 tee find.out

(그래도 find심각한 문제를 일으킬 정도로 버퍼링이 느린 것은 아닌가 하는 생각이 듭니다.)

관련 정보