![읽는 동안 및 파이프 일시 중지가 포함된 Bash tail -f](https://linux55.com/image/94273/%EC%9D%BD%EB%8A%94%20%EB%8F%99%EC%95%88%20%EB%B0%8F%20%ED%8C%8C%EC%9D%B4%ED%94%84%20%EC%9D%BC%EC%8B%9C%20%EC%A4%91%EC%A7%80%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20Bash%20tail%20-f.png)
Bash에서는 루프 tail -f
에 파이프를 연결하면 무기한 차단됩니다.read
while read LINE0
do
echo "${LINE0}";
done < <( tail -n 3 -f /tmp/file0.txt | grep '.*' )
# hangs
-f
또는 를 제거 | grep '.*'
하면 루프가 반복됩니다.
다음 접근 방식은아니요보류.
tail -n 3 -f /tmp/file0.txt | grep '.*'
이 동작의 원인은 무엇입니까?
Bash에서 파일을 추적하고 파이프 표현식을 읽을 수 있습니까?
답변1
파이프에서는 grep
출력이 버퍼링됩니다. GNU 구현을 사용하면 grep
다음을 사용할 수 있습니다 --line-buffered
(여기 문서);예를 들어:
tail -n 3 -f /tmp/file0.txt | grep --line-buffered '.*' |
while IFS= read -r LINE0
do
printf '%s\n' "${LINE0}"
done
답변2
Greg의 Wiki에는 버퍼링에 대한 포괄적인 기사가 있습니다.https://mywiki.wooledge.org/BashFAQ/009
나에게 맞는 기술(Popos 20.04, Ubuntu 20.04)은 stdbuf
라인 버퍼링을 위한 것입니다. 그들의 예:
tail -f logfile | stdbuf -oL grep 'foo bar' | awk ...
내 사용 사례:
journalctl --output=json -t poke-stats -f |\
stdbuf -oL jq -r '.__REALTIME_TIMESTAMP' |\
stdbuf -oL awk '{print $1-last;last=$1}'