2017-11-18 4 views
1

リクエストで受け取ったデータで構成される圧縮ファイルを生成するサービス「A」があります。並行して、これらの圧縮ファイルを消費する別のサービス「B」があります。対応する「準備完了」ファイルを持つファイルを一覧表示する

"B"は、完全に書き込まれていない限り、ファイルを消費してはいけません。サービスは、上記の拡張子とともに生成されたファイルと全く同じ名前のサービス "A"によって作成された ".ready"ファイルを探すことによってこの情報を推測します。圧縮が完了したらサービス "B"はApache Camelを使用してこのフィルタリングを行います。

今、同じ圧縮ファイルが必要なシェルスクリプトを作成していますが、これはシェルで同じフィルタリングを実装する必要があります。私はこのスクリプトを書くのに助けが必要です。私はコマンドを知っていますが、ナイーブなシェルユーザーですので、非常に知識が限られています。

例:

圧縮ファイル:sumit_20171118_1.gz準備 ファイル対応

:sumit_20171118_1.gz.ready

別の圧縮ファイル:sumit_20171118_2.gz

ありません準備ができたファイルをこれには存在します。

上記のファイルのうち、最初のファイルのみが、対応するレディファイルを持っているので、ピックアップする必要があります。

+2

'.ready'サフィックス? – melpomene

+0

はい、確かにオプションです。私は、これを行ういくつかのコマンド/ビルドされた機能が存在するかどうか疑問に思っていました。あるいは、一般的に、そのようなケースに対処するための標準的な方法がある場合。 –

+1

**サービスB **が圧縮ファイルを探している場合、通常は**サービスA **は '.inprogress'のような拡張子でファイルを書き込み、ファイルが完全に書き込まれると**サービスA **その名前が '.gz'で終わるように変更します。これにより、** Service B **に完全なファイルをアトミックにリリースします。 –

答えて

0

最も明白な方法は、ビジーなループを使用することです。しかし、あなたがGNU/Linuxの上にある場合は、それよりも良い行うことができます(から:https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-dir-processor

inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | 
    parallel -uj1 echo Do stuff to file {} 

あなたも.readyファイルを待つ必要はありません。この方法:への書き込み時にコマンドが実行されますがファイルは終了し、ファイルは閉じられます。

、しかし、.readyファイルは、その後、あなたが検索することができますかなり後に書かれている場合は、その1:

あなただけのループすべての `* .ready`ファイルの上に、その後、切断していないのはなぜ
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | 
    grep --line-buffered '\.ready$' | 
    parallel -uj1 echo Do stuff to file {.} 
関連する問題