1

私の要件は、cron ジョブからシェル スクリプトを使用して継続的に更新されている大きなファイルを読み取ることです。利用可能な最後の行まで読み込んでから、プロセスを停止します。次に cron ジョブが開始されるとき、ジョブは最後に終了した位置から読み取る必要があります。シェルスクリプトでこれを行う方法についての提案。

Solaris Unix を使用しています。

4

2 に答える 2

1

このようにしてみてください(もちろん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

そのため、主なツールは「テール」です。ご不明な点がございましたらお問い合わせください。

于 2013-12-30T07:59:59.733 に答える
0

すでに示したように、「tail -f」を使用するのが最善の方法ですが、何らかの理由でプログラムが停止した場合、最初から読み始める必要があり、「tail -f」を使用して中断したところから続行することはできません。 .

したがって、唯一の方法は、独自の C アプリケーションを作成することです。かなり単純なので、十分に簡単なはずです。「ftell」を使用して、データ ファイルのどこにいるかを調べることができます。次に、その結​​果を他のファイル (制御ファイル) に書き込みます。これは、アプリケーションを終了する前、または読み取りごとに (行を再処理しないことが重要な場合) のいずれかです。

アプリケーションを再起動したら、その制御ファイルを読み取り、値を解析し、「fseek」を使用して中断した場所にジャンプします。

データ ファイルが他のアプリによって切り捨てられた場合は、そのアプリからも制御ファイルを削除する必要があります。それ以外の場合は、ファイルが新しいことを知る別の方法を見つける必要があります。読み取った「fseek」が現在の「ftell」よりも大きい可能性があります。これは、ファイルが以前よりも小さいことを示しますが、すべての不測の事態をカバーするわけではありません。

「fstat」を調査し、データ ファイルの作成時刻を使用して、制御ファイルに保存した作成時刻よりも新しいかどうかを確認できます。可能であれば、ファイルの最初のファイルに日付/時刻スタンプを書き込みます。行、それも制御ファイルに書き込みます。アプリの再起動時に、最初の行のタイムスタンプが制御ファイルのタイムスタンプと一致しない場合は、最初から読み取ります。それ以外の場合は、「fseek」によって正しい場所に移動するはずです。

于 2013-03-14T20:04:05.173 に答える