web-dev-qa-db-ja.com

コピー中にGZipファイルがまだ書き込まれていることを確認する方法

パスにgzipファイルを取得しています。

入力フォルダパス:

<server>/input_gate

このフォルダにあるGZIPファイルが有効かどうかを確認したいですか?次のコマンドを使用しました。有効なgzipファイルを見つけるのは良いことですか?

gzip -t -v <file_name>

ただし、移動が行われている場合、ファイルは無効なファイルとして表示されます。ただし、実際には、移動が完了するとファイルは有効になります。取得したファイルが完全に移動されたファイルであるか、移動がまだ進行中であるかを確認する方法はありますか?

3
Raj

“ Ask Ubuntu” のこの回答に従って、 lsof (開いているファイルのリスト)を使用して、ファイルが開いているかどうかを確認できます。

lsof | grep <server>/input_gate
0
JakeGould

lsofの使用

path/to/input_gateなどのプロセスでファイルが開いているかどうかをテストするには、次のコマンドを実行します。

lsof path/to/input_gate

これは、ファイルを使用しているプロセスがある場合はコード0で終了し、ファイルを使用しているプロセスがない場合(またはエラーが発生した場合)はコード1で終了します。この終了コードは、シェルコマンドで使用できます。

テスト

これをテストするために、ファイルを開くプロセスを作成しましょう。

sleep 10 >>path/to/input_gate &

これにより、ファイルが10秒間開いたままになります。 lsofをテストするには、次のコマンドをすばやく実行します。

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
In use

10秒待ってから、再試行してください。

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
Not in use

ファイルの準備ができるまで待つ

他のプロセスがファイルを使用しなくなるまで待ちたい場合:

while lsof path/to/input_gate >/dev/null; do sleep 1; done; echo "Finally, not in use"

inotifywaitの使用

システムがinotifywaitをサポートしている場合(Linuxシステムがサポートしている必要があります)、対象のファイルでクローズイベントを探すことができます。

inotifywait  "path/to/input_gate" -e close

上記のコマンドは、何らかのプロセスがファイルを閉じるまでブロックします。

このアプローチの利点は、ポーリングが不要になることです。

このアプローチの欠点は、あるプロセスがファイルを閉じることを最初に通知することであり、それはファイルを閉じたallプロセスと同じではない可能性があります。

0
John1024