継続的に更新されるログファイルがあります。 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が空であるか、切り捨てられるか、ゼロが記録されていることを確認する必要があります。