4

インストール時にWebからダウンロードする他のバイナリに依存するプロジェクトがあります。このために私が行うことは次のとおりです。

if ( file-present-in-src/)
    # skip that file
else
    # use wget to download the file

このアプローチの問題は、途中でダウンロードを中断し、次にスクリプトを呼び出すと、部分的にダウンロードされたファイルもスキップされることです(これは望ましくありません)。また、wgetで部分的にダウンロードされたファイルのダウンロードを再開したいです。 。

どのようにすればよいですか:私が考えることができる可能な解決策:

  1. ファイルをdownload_tmpなどのファイルにダウンロードします。成功した場合は元のファイルに移動します。
  2. SIG {'INT'}を処理して、適切なクリーンアップコードを記述します。

しかし、これらのどれも部分的なファイルのダウンロードを再開するのに役立ちませんでした、

洞察はありますか?

4

3 に答える 3

3

まず、wgetを使用してダウンロードを行っているため、これがPerlと何の関係があるのか​​わかりません... libwww-perl(perldoc LWP)を使用して、ダウンロードプロセスをより細かく制御できます。

次に、「tmp」ファイル名にダウンロードして、成功したときにファイルを移動するというアイデアを2番目に示します。

ただし、さらに進んでファイルの整合性を検証する必要があると思います。MD5またはSHAハッシュを実行するのは非常に簡単で、ダウンロードしたものを期待するものと一致させます。チェックサム(filename.md5)を含む短いファイルをサーバー上に置くことができます。一致する場合にのみ成功を判断します。

すべてのシグナルをキャッチし、一般的にプロセスを強制終了できないようにしようとし、それが機能したことを期待すると、ある時点で失敗することに注意してください。ネットワークのタイムアウト、クラッシュ、電源障害、サーバーの構成の問題が発生する可能性があります。代わりに、ダウンロードが失敗する可能性があると想定し、プロセスを回復できるようにコーディングする必要があります。

最後に、ダウンロードしているバイナリの種類と、それらを使用して何をしているのかを教えてくれません。wgetを使用しているので、Unixを使用していると仮定します。RPM+Yumなどの使用を検討する必要があります。これらはすべてこれを処理します。RPMは本当に簡単に書くことができます。

于 2010-03-21T13:13:53.720 に答える
1

あなたの最初のアプローチを使用してください..

  1. 「FileName」.tmpにダウンロード
  2. 「FileName」.tmpを「FileName」
    に移動しますmove!コピーしない
  3. 日当ごとに1回、すべての.tmpファイルをクリーンアップします(paranoia rulez)
于 2010-03-21T12:05:20.750 に答える
1

wget-N-cオプションを使用して、「ファイルが存在する場合」のロジック全体を削除することができます。

于 2010-03-21T13:34:29.077 に答える