私が望むのは、新しいファイルが作成されるかどうかを監視し(再帰的ではなく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
次のコマンドを実行すると、inotifywait
optionsを使用して出力を後処理する必要はありません。--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の実行時に使用するファイルのリストを保持し、次の実行時にそのファイルをフィルタリングする必要があります。