Inotifywaitディレクトリに多数のファイルがあります。

Inotifywaitディレクトリに多数のファイルがあります。

私が望むのは、新しいファイルが作成されるかどうかを監視し(再帰的ではなく1つだけ)、そのファイルが書き込まれるときに大きなファイルに追加することです。

記録されるファイルの数は膨大で、最大50,000個まで可能です。

たとえば、次のようにディレクトリinotifywaitを監視しています。

inotifywait -m -e create ~/folder | awk '($2=="CREATE"){print $3}' > ~/output.file

したがって、生成された新しいファイルの名前を保存して~/output.fileからforループを使用します。

for FILE in `cat ~/output.file` 
do
    cat $FILE >> ~/test.out
done

ファイルの書き込み(生成)速度が1秒~/folderあたり1ファイル程度であれば正常に動作します。

ただし、要件が膨大でファイルが生成される速度も、毎分500ファイル(またはそれ以上)ほど非常に高いです。

プロセスが完了した後にファイル数を確認しましたが、~/folder出力と一致しませんでしたinotifywait。 10~15個程度のファイル差があり、人によって異なります。

しかもループ

for FILE in `cat ~/output.file`
do
done

~/output.fileすべてのファイルが書き込み時に処理されるわけではありません。

誰でも私にこの問題に対する優雅な解決策を提案できますか?

答え1

次のコマンドを実行すると、inotifywaitoptionsを使用して出力を後処理する必要はありません。--format--outfile

inotifywait -m --format '%f' -e create /home/don/folder/ --outfile /home/don/output.file

次に、別のタブを開き、cd~/folderを実行します。

time seq -w 00001 50000 | parallel touch {}

real    1m44.841s
user    3m22.042s
sys     1m34.001s

(したがって、毎分500を超えるファイルを受信して​​います。)すべてがうまく機能し、作成したすべてのファイル名がoutput.file含まれています。プロセスがディスクにファイルを書き込むと、その内容をファイルに追加できます(常にオンになっていると仮定)。50000
test.out~/folder

xargs < /home/don/output.file cat >> test.out

または、readファイルの作成時に処理したい場合に使用します。だから、しかし、以下~/folderを実行できます。

inotifywait -m --format '%f' -e create ~/folder | while read file; do cat -- "$file" >> ~/test.out; done

答え2

あなたができることの1つは、処理されたファイルを処理した後にあるディレクトリから別のディレクトリに移動する小さなプログラムを作成することです。完了したら、ディレクトリ検索を再開してください。ファイルが存在しない場合は、再スキャンする前に適切な時間休止状態を維持し、ファイルの作成中は休止状態を維持します(ファイルを生成するプロセスは最大100分程度実行されるようです)。

ディレクトリからファイルを移動できない場合は、他のアプローチは過去のどこかで日付/時刻スタンプDTSで始まることです。次に、DTSより最新のすべてのファイルを見つけて処理し、ファイルのタイムスタンプがDTSより最新の場合はDTSを更新します。上記の回避策と同様に、この手順を繰り返します。タイムスタンプの粒度のために2つのファイルが同じでない場合は、DTSよりも最新のファイルのみを見つけることができます。そうでない場合は、DTSより古いファイルを見つけて、次のDTSの実行時に使用するファイルのリストを保持し、次の実行時にそのファイルをフィルタリングする必要があります。

関連情報