파일이 잘릴 때 tail -f가 중단됩니다.

파일이 잘릴 때 tail -f가 중단됩니다.

나는 tail -f(Mac OS X el Capitan의 터미널에서) 파일의 실시간 변경 사항(PERL 스크립트를 사용하여 데이터베이스에서 데이터를 가져온 결과)을 보는 데 사용하고 있습니다. 그러나 Perl 스크립트가 파일을 자르고 새 데이터를 추가하는 경우도 있습니다. 가끔 이런 일이 발생하면 다음과 같은 메시지가 나타납니다.

tail: test.txt: file truncated

그러면 파일의 내용이 표시되지 않습니다. 이는 파일을 이전보다 적은 줄로 교체할 때만 발생하는 것 같습니다. 새 줄이 스크립트를 실행하기 전보다 길어지면 이 오류가 발생하지 않고 tail -f계속 작동합니다. 실제로 tail -f이 (오류?) 메시지를 받은 후 파일의 데이터가 표시되지 않는 것을 확인했습니다.

나는 이와 비슷한 질문을 본 적이 있습니다.tail을 사용할 때 "파일 잘림" 메시지를 억제합니다.

tail -f test.txt 2> /dev/null

그러나 이는 메시지를 억제할 뿐이고 여전히 중단되며 더 짧고 잘린 파일 내용을 계속 표시하지 않습니다.

실시간으로 파일 변경 사항을 볼 수 있는 더 나은 명령이 있습니까? 아니면 tail -f파일이 잘릴 때 무시 하는 플래그가 있나요 ?

답변1

다른 사람들이 지적했듯이 tailOS X와 ​​함께 제공되는 명령에는 해당 옵션이 없습니다 --retry. 그러나 해당 옵션을 사용하여 GNU 버전의 tail을 간단히 설치할 수 있습니다.GNU 핵심 도구. 예를 들어 MacPorts를 사용하는 경우 sudo port install coreutils.

실시간으로 파일을 보는 것에 대한 대안은 watch불행하게도 OS X에서도 사용할 수 없는 명령입니다. 그러나 다음을 사용할 수 있습니다.이 간단한 솔루션.

답변2

이것은 tail-F스크립트입니다. 하나의 매개변수, 즉 tail 파일을 사용합니다. 더 나은 옵션(예: GNU 설치 tail)이 있을 수 있지만 이는 사용 가능한 부분으로 간단한 도구 버전을 만들 수 있는 경우가 많다는 것을 증명하기 위한 것입니다.

#!/bin/bash
#
file="$1"
size=$(stat -c '%s' "$file" 2>/dev/null)
test -z "$size" && echo "No file '$file'" >&2

while sleep 1
do
    n_size=$(stat -c '%s' "$file" 2>/dev/null)

    if [[ -n "$n_size" ]]
    then
        if [[ 0 == "$size" ]]
        then
            # Output whole file (so far)
            dd bs=1K if="$file" 2>/dev/null
            size="$n_size"

        elif [[ "$n_size" > "${size:-0}" ]]
        then
            # Output new part of file
            dd bs="$size" skip=1 if="$file" 2>/dev/null
            size="$n_size"

        elif [[ -z "$size" ]]
        then
            echo "New file '$file'" >&2
            size=0

        elif [[ "$n_size" < "${size:-0}" ]]
        then
            echo "Rewinding file '$file'" >&2
            size=0
        fi
    fi
done

답변3

사용tail --f=name

-f이 플래그의 기본값은 입니다 descriptor. 이름으로 변경하면 tail파일 이름을 따르며 파일이 잘려도 계속 표시됩니다.

추신. 메시지는 계속 수신됩니다.tail: File truncated

답변4

다음 명령은 파일이 삭제되거나 액세스할 수 없는 경우에도 파일을 계속 재시도합니다. 생성 후 내용을 다시 인쇄합니다.

tail -F filename --retry

관련 정보