ディレクトリ内のプロセスファイル[重複]

ディレクトリ内のプロセスファイル[重複]

重複の可能性:
ディレクトリの内容が更新されたときにコマンドを実行する方法は?

私は1分ごとにディレクトリ内のファイルを見つける簡単なetlプロセスを書こうとしています。ファイルがある場合は(スクリプトを介して)リモートシステムにロードしてから削除します。

状況を複雑にすると、ロードに1分以上かかることがあります。この問題を解決するために、すべてのファイルを一時処理ディレクトリに移動し、そこで作業してからそこから削除できると思いました。また、コマンドラインスクリプトの作成をよりよく試みながら、よりエレガントなソリューションを試しています。まず、作業を実行するために、次の簡単なスクリプトを作成しました。

#!/bin/bash

for i in ${find /home/me/input_files/ -name "*.xml"}; do
FILE=$i;
done;
BASENAME=`basename $FILE`
mv $FILE /tmp/processing/$BASENAME
myscript.sh /tmp/processing/$BASENAME other_inputs
rm /tmp/processing/$BASENAME

スクリプトは、処理ディレクトリからほぼ直ちにファイルを削除し(重複処理の問題を回避)、最終的にそれ自体をクリーンアップしてそれらの間でファイルを処理できるようにします。

しかしこれは結局U/Linuxである。巨大なスクリプトを維持するのではなく、パイプを接続して移動して、これらすべての作業を1行で実行できる必要があると思います。

さらに、同時プロセスに並列性を使用することも利点となり得る。

付録:ある種のFIFOキューがこの質問に対する答えになる可能性があります。あるいは、cronの代わりに他の種類のディレクトリウォッチャーがあるかもしれません。私は私の小さな台本よりもエレガントな提案で開いています。唯一の問題は、「入力ディレクトリ」のファイルが実際に記録される前にタッチされることです。 -size -0 は実際のファイルを処理するためだけに必要です。

ベストアンサー1

小さな処理スクリプトを作成し、並列処理にGNU Parallelを使用できるように聞こえます。

http://www.gnu.org/software/parallel/man.html#example__gnu_parallel_as_dir_processor

だからこんな感じ:

inotifywait -q -m -r -e CLOSE_WRITE --format %w%f my_dir |
  parallel 'mv {} /tmp/processing/{/};myscript.sh /tmp/processing/{/} other_inputs; rm /tmp/processing/{/}'

詳しくは、紹介ビデオをご覧ください。http://pi.dk/1

編集する:

長さゼロのファイルを処理するには(つまり無視)、myscript.shが必要です。

これを回避できる場合は、touch次のようにすることもできます。

inotifywait -q -m -r -e CLOSE_WRITE --format %w%f my_dir |
  parallel myscript.sh {} other_inputs

GNU Parallelのインストールは非常に簡単です。

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

おすすめ記事