cron 작업을 통해 로그 파일을 다운로드했습니다. 원격 위치에서 파일이 업데이트되면 데이터만 추가하더라도 로컬 복사본이 처음부터 다시 작성됩니다.
tail -f
또는 같은 도구since
이것을 "파일이 교체되었습니다"로 처리하고 처음부터 다시 출력하는 것 같습니다. 즉, 알려진 모든 것을 반복합니다. 특히 이 두 도구는 STDERR에서 이를 명시적으로 언급합니다.
따라서 터미널에서 호출하면 다음과 같습니다.
for j in $(seq 2 4) ; do for i in $(seq 1 $j) ; do echo $i ; sleep 1; done > /tmp/foo; done
tail -f /tmp/foo
tail -F /tmp/foo
터미널과 다른 터미널 모두에서 다음 경고가 표시됩니다 .
1
2
tail: /tmp/foo: file truncated
1
2
3
tail: /tmp/foo: file truncated
1
2
3
4
을(를 ) 사용할 때 while sleep 0.25; do since /tmp/foo; done
다음 오류 메시지 중 하나가 나타납니다.
1
2
since: considering /tmp/foo to be truncated, displaying from start
1
2
3
since: considering /tmp/foo to be truncated, displaying from start
1
2
3
4
since
파일 이름 대신 inode를 명시적으로 파일 키로 사용합니다. tail
잘린 파일을 식별하는 것과 유사한 작업을 수행할 수 있습니다.
제가 시도한 또 다른 "도구"는 Perl 라이브러리였습니다.파일::꼬리, 그러나 동일한 "문제"가 있으며 경고가 없습니다(적어도 기본 설정에서는).
그래서 궁금합니다. inode를 보지 않고 파일의 내용만 보고 데이터가 아직 첨부되지 않은 경우에만 다시 시작하는 방법이나 도구가 있습니까?
내가 원하는 것은 다음 출력입니다.
1
2
3
4
(나는 본 적이 있다tail -f 그러나 파일이 삭제되고 다시 생성될 때(추가 없이), 하지만 여전히 파일의 내용을 처음부터 다시 출력하기 때문에 도움이 되지 않습니다. )
예, 그러한 도구에는 표시된 모든(잘리지 않은) 데이터의 캐시 또는 적어도 해당 데이터의 해시 합계가 필요하다는 것을 알고 있습니다.
답변1
이는 tail
귀하의 사용 사례에 비해 너무 똑똑합니다. 여기에서 다음을 수행할 수 있습니다.
{
tail
while cat; do
sleep 1
done
} < /tmp/foo
tail
( -f
1980년 SysIII에 추가됨) 의 원래 구현과 동일합니다 .
cat
sleep
내장 명령이 내장된 쉘이나 내장 명령을 사용하는 것이 더 좋습니다 . 아니면 perl
/ 에서 실행하세요 python
.
예를 들어 기본적으로 내장되어 있는 ksh93
에서는 내장 함수를 사용하여 활성화할 수 있습니다 . 에서는 다음 대신 in 루프를 사용할 수 있습니다 .sleep
cat
builtin cat
zsh
sysread
cat
zselect
sleep
zmodload zsh/zselect
zmodload zsh/system
readall() while sysread -s 65536 -o1; do continue; done
{
tail
while readall; do
zselect -t 100
done
} < /tmp/foo
매번 새 파일을 생성하면 tail -f
감지되지 않습니다. 이 경우에도 다음을 수행하여 이를 수행할 수 있습니다.
#! /bin/zsh -
zmodload zsh/zselect
zmodload zsh/system
readall() while sysread -s 65536 -o1; do continue; done
file=${1-/tmp/foo}
{
tail
(( offset = systell(0) ))
} < $file || exit
while true; do
if
sysopen -ru0 -- $file 2> /dev/null &&
sysseek $offset &&
readall
then
(( offset = systell(0) ))
fi
zselect -t 100
done
파일을 다시 열고 각 반복에서 마지막으로 알려진 오프셋을 찾습니다.