私の要件は、cron ジョブからシェル スクリプトを使用して継続的に更新されている大きなファイルを読み取ることです。利用可能な最後の行まで読み込んでから、プロセスを停止します。次に cron ジョブが開始されるとき、ジョブは最後に終了した位置から読み取る必要があります。シェルスクリプトでこれを行う方法についての提案。
Solaris Unix を使用しています。
このようにしてみてください(もちろんcronに追加してください):
#!/bin/bash
#STAT_FILE=/tmp/stat.tmp
PREV_LINE_STAT=/tmp/prev_last_line.tmp
LINE=$(cat log | wc -l)
LOG=/tmp/log.tmp
if [ -f $PREV_LINE_STAT ]
then
PREV_LINE=$(cat $PREV_LINE_STAT)
else
PREV_LINE=0
fi
declare -i LINE_RANGE
LINE_RANGE=$LINE-$PREV_LINE
if [ $LINE_RANGE -lt 0 ]
then
LINE_RANGE=$LINE
fi
tail -n $LINE_RANGE log > $LOG
COUNT1=$(grep any_word $LOG |wc -l)
echo "-------------------
LINE_RANGE is $LINE_RANGE
-------------------
number of words
$COUNT1" > test.txt
echo $LINE > $PREV_LINE_STAT
cat test.txt
そのため、主なツールは「テール」です。ご不明な点がございましたらお問い合わせください。
すでに示したように、「tail -f」を使用するのが最善の方法ですが、何らかの理由でプログラムが停止した場合、最初から読み始める必要があり、「tail -f」を使用して中断したところから続行することはできません。 .
したがって、唯一の方法は、独自の C アプリケーションを作成することです。かなり単純なので、十分に簡単なはずです。「ftell」を使用して、データ ファイルのどこにいるかを調べることができます。次に、その結果を他のファイル (制御ファイル) に書き込みます。これは、アプリケーションを終了する前、または読み取りごとに (行を再処理しないことが重要な場合) のいずれかです。
アプリケーションを再起動したら、その制御ファイルを読み取り、値を解析し、「fseek」を使用して中断した場所にジャンプします。
データ ファイルが他のアプリによって切り捨てられた場合は、そのアプリからも制御ファイルを削除する必要があります。それ以外の場合は、ファイルが新しいことを知る別の方法を見つける必要があります。読み取った「fseek」が現在の「ftell」よりも大きい可能性があります。これは、ファイルが以前よりも小さいことを示しますが、すべての不測の事態をカバーするわけではありません。
「fstat」を調査し、データ ファイルの作成時刻を使用して、制御ファイルに保存した作成時刻よりも新しいかどうかを確認できます。可能であれば、ファイルの最初のファイルに日付/時刻スタンプを書き込みます。行、それも制御ファイルに書き込みます。アプリの再起動時に、最初の行のタイムスタンプが制御ファイルのタイムスタンプと一致しない場合は、最初から読み取ります。それ以外の場合は、「fseek」によって正しい場所に移動するはずです。