나는 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
답변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