지속적으로 업데이트되는 로그 파일이 있습니다. 5분마다 파일을 읽고 awk 명령을 실행하여 일부 지표를 Cloudwatch로 보내는 cron 작업을 실행하고 싶습니다.
이제 마지막 읽기 작업에서 남은 파일을 읽고 싶습니다.
어떻게 해야 하나요?
답변1
마지막 오프셋을 기록해야 합니다.
bash 대신 연산자가 내장되어 있으므로 ksh93 또는 zsh를 사용하는 것이 더 쉬울 것입니다.
예를 들어 ksh93의 경우:
#! /bin/ksh93 -
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")
{
do-your-processing; ret=$?
echo "$(<#((CUR)))" > "$offset_file" && exit "$ret"
} < "$file" <#((offset))
그리고 zsh
:
#! /bin/zsh -
zmodload zsh/system
file=/some/file.log
offset_file=$file.offset
offset=$(<$offset_file)
{
sysseek offset || exit
do-your-processing; ret=$?
echo $((systell(0))) > $offset_file && exit $ret
} < $file
를 사용하면 bash
위의 대부분 작업을 수행하고 을 호출 ksh93
하거나 다음을 찾 zsh
거나 perl
말할 수 있습니다.
#! /bin/bash -
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")
seek() {
OFFSET=$1 perl -e '
seek(STDIN, $ENV{OFFSET}, 0) || die "seek: $!\n"'
}
tell() {
perl -le 'print tell(STDIN)'
}
{
seek "${offset:-0}" || exit
do-your-processing; ret=$?
tell > "$offset_file" && exit "$ret"
} < "$file"
파일이 잘릴 때마다 file.offset이 비어 있거나 잘리거나 0이 기록되는지 확인해야 합니다.