'tail -f' 버퍼를 플러시하시겠습니까?

'tail -f' 버퍼를 플러시하시겠습니까?

나는 다음 문장(간략화된 버전)을 사용하고 있습니다:

tail -f -c+1 <filename>

파일을 프로세스로 파이프하기 위해.

그런데 끝에 파이프로 연결되지 않은 줄이 많다는 걸 발견했습니다.

구체적인 예는 mysql 파일을 파이핑하고 끝에 도달하면 중지하는 것입니다.

tail -f -c+1 mysqdump.sql | sed '/^-- Dump completed/ q0'

이것은 작동하지 않습니다. 덤프의 마지막 줄이 -- Dump completed [...]sed로 연결되지 않습니다.

내 생각에는 tail -f이 경우 버퍼가 가득 찼을 때만 플러시되는 것 같습니다.

이 문제를 어떻게 해결할 수 있는지 아는 사람 있나요?

=================

이유를 찾았습니다. 설명이 불완전하고 코드가 동작을 나타내지 않습니다.

이 문제는 압축된(lzma) 파일에서 파이핑할 때 발생합니다.

tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'

tail입력이 바이너리이기 때문에 마지막 압축 청크는 새 줄을 감지하지 못하기 때문에 전송되지 않을 가능성이 큽니다 .

답변1

tail -f각 입력 라인 후에 새로 고칩니다. strace(또는 trussUNIX 변형이 프로세스의 시스템 호출을 추적하기 위해 제공하는 것)을 사용하여 이를 확인할 수 있습니다 .

불완전한 줄이 있으면 tail -f다음 개행 문자를 계속 기다립니다. 텍스트 파일용으로 특별히 설계된 도구입니다. 후행 바이너리가 필요한 경우(예: -- Dump completed그 뒤에 개행 문자가 없는 경우) 사용자 정의 도구를 사용해야 합니다.

출력을 터미널에서 다른 방향으로 리디렉션 하면 sed자체 버퍼링이 수행됩니다. 노력하다stdbuf또는unbuffer.

답변2

사용 예 stdbuf -o0. 인용하다:https://superuser.com/a/1123674/126847

tail -F cpu.log | stdbuf -o0 tr '=' ' ' | stdbuf -o0 awk '$6 > 1'

답변3

질문에서 호출된 명령의 한 가지 문제점은 sed버퍼링 모드에서 호출된다는 것입니다.

tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'

플래그를 추가해야 합니다 -u.

tail -f -c+1 <filename.lzma> | lzma -d | sed -u '/^-- Dump completed/ q0'

자세한 내용은 -u스위치 에 대해 읽어보세요.sed 매뉴얼 페이지.

관련 정보