ファイルが完全に作成されたかどうかはどうすればわかりますか?

ファイルが完全に作成されたかどうかはどうすればわかりますか?

リモートコンピュータからいくつかのファイルが到着するのを待って到着すると、そのファイルを新しいファイルとしてキャプチャするシェルスクリプトがあります。これを行うには、次のwhileループを使用します。

while true
do

    if [ $(find ../Test_Data/local_enc* | wc -l) -eq 2 ]
    then
            break
    else
            sleep 0.001

    fi
done
cat ../Test_Data/local_enc* > ../Test_Data/All_Enc_Coords.txt

問題は、All_Enc_Coordsファイルが書き込まれたり、書き込まれないことがあることです。ファイルにデータがない場合でも、 find 関数が何らかの値を返すためだと思います。

ファイルの書き込みが成功したことを確認するには?そして、whileループでこれを指定する方法です。つまり、すべてのファイルを完全に作成して処理したいですか? ..cat以前にsleep 1を使用していましたが、ファイルが完全に書き込まれたことがわかりましたが、これを確認する方法はありますか?

ベストアンサー1

リモートコンピュータからファイルを作成し、アップロードを開始する前に削除するようにできますか?

たとえば、sshを使用している場合(ftpまたはHTTP PUTを使用して同様の操作を実行できます):

ssh yourhost touch ../Test_Data/upload-in-progress
scp local_enc* yourhost:../Test_Data/
ssh yourhost rm ../Test_Data/upload-in-progress

スクリプトが何をすべきかは、アップロードされたファイルが消えるのを待つことです。これはスリープループを介して実行することも、パッケージinotifywaitの内容を使用して実行することもできますinotify-tools

注:アップロードを完了する前にリモートホストが死亡した場合、またはスクリプトが終了すると、古いアップロードファイルが残ります。私の考えでは、これはアップロードがいつ完了するかを推測して競合状態を生成するリスクよりはるかに小さい問題です(ターゲットシステムでのみ実行されるすべてのソリューションは傾向があるため)。

最初は使用することを検討しましたが、lsof | grep local_enc | wc -lこれはあなたと同じように競争が起こりやすいですfind .. | wc -l

Test_Dataディレクトリへの変更についての通知を受け取るために、または同様の使用とは異なり、inotifyそのディレクトリでファイルが作成/変更される時期はわかりますが、アップロードセッションが完了する時期はわかりません...しかし、inotifyファイルを一緒に使えます。セマフォを使用すると動作します。 inotifyは、Test_Dataディレクトリが変更されるのを待ってから、進行中のアップロードが削除されるまで待機し続けます。

また、リモートホストのアップロードスクリプトがcronで実行されている場合、古いアップロードファイルは次回実行されると自動的に変更されます。または、アップロードされたファイルinotifywaitが次のより古いと仮定するようにスクリプトを作成することもできます-t--timeout

おすすめ記事