6

ファイルが特定のディレクトリに移動されたらすぐに実行したいビデオエンコーディングスクリプトがあります。

inotifyのようなものを使用する場合、ファイルの移動が完了するまでファイルがエンコードされないようにするにはどうすればよいですか?

私は次のようなことを検討しました:

  • (rsync)ファイルを一時ディレクトリにコピーします。
  • 終了したら、(単純な'mv')をencodeディレクトリに移動します。
  • スクリプトにエンコードディレクトリを監視させます。

ただし、ステップ#2を正しく機能させ、#1が完了したときにのみ実行するにはどうすればよいですか?

Ubuntu Server 11.10を使用していて、bashを使用したいのですが、問題を単純化する場合は、Pythonを使用するように説得できます。

私はファイル自体をこのディレクトリに「ダウンロード」していません。むしろ、私はほとんどの場合rsyncを使用します。

さらに、このUbuntuサーバーはVM上で実行されています。

FreeBSDサーバーからNFS経由でメインファイルストレージをマウントしています。

4

3 に答える 3

2

最も簡単な方法は、ファイルのダウンロードが完了するまで終了しないwgetプログラムを使用してダウンロードすることです。curlそれが失敗した場合、それが絶対的な最善の解決策であるかどうかはわかりませんが、ループするスクリプトを使用して、ファイルが開いているかどうかを確認することができlsofますgrep

while lsof | grep /path/to/download >/dev/null; do sleep 5; done
mv /path/to/download /path/to/encode/dir
于 2012-04-15T17:01:55.960 に答える
1

私が使用する手法の1つは、FTPで機能します。FTPサーバーにコマンドを発行して、ファイルを補助ディレクトリーに転送します。コマンドが完了したら、2番目のコマンドをサーバーに送信します。今回は、ファイルの名前をauxディレクトリから最終的な宛先ディレクトリに変更するように指示します。inotifyまたはディレクトリのポーリングを使用している場合、ファイル名は表示されません。したがって、名前の変更が完了するまで、ファイルが完全であることが保証されます。

私はrsyncに慣れていないので、同様の名前変更機能があるかどうかはわかりません。

于 2012-04-16T14:52:32.450 に答える
0

inotifywait有望に見えます。通知が設定される前にダウンロードが終了すると、永久に待機するため、ある程度注意する必要があります。

inotifywait -e close_write "$download_file"
mv "$download_file" "$new_location"
于 2012-04-16T14:34:43.483 に答える