web-dev-qa-db-ja.com

wget -i各ファイルが終了したときに通知します(処理目的で)

ダウンロードした直後にwget -iによってダウンロードされた複数のファイルを処理できるようにしたい(内のすべてのファイルを待つのではなく)終了するリスト-wgetプロセス全体を終了します)。問題は次のとおりです。wgetはファイルを所定の場所にダウンロードするため、ファイルを安全に処理できる(完全にダウンロードされている)時期がわかりません。理想的には、原則的なアプローチは、(私が信じる)wgetで最初にファイルを一時ディレクトリにダウンロードし、完了したらmvで実際の宛先ディレクトリにダウンロードすることです。 mvはアトミック*であるため、宛先ディレクトリに存在するすべてのファイルが完全にダウンロードされ、処理の準備ができていることを保証できます。

マンページを確認しましたが、この目的のために何も見つからないようです。私の現在のハッキーなアプローチは、fuserを使用して、wgetでファイルが開かれていないかどうかを確認することです。しかし、これは非常に壊れやすく(wgetがファイルを複数回開くとどうなりますか?)、それを避けたいと思います。

これを正確に達成する方法がない場合、同じ効果を達成できる回避策はありますか?関係がある場合、ファイルはHTMLページです。

*補遺:どうやら mvはアトミックではないかもしれません (私の環境ではそうですが)厳密なアトミック性は必要ないと思いますが。唯一の要件は、ファイルの名前が宛先ディレクトリに変更されると、完全にダウンロードされることです(そして、完全なコンテンツは新しいパスですぐに利用できます)。

編集:プロセスを複数のwgetコマンドに分割することも、wgetのいくつかのコア機能(レート制限、HTTPキープアライブ、DNSキャッシングなど)の使用を妨げるため、理想的ではありません。

1
Bailey Parker

使用する aria2c代わりに:

aria2c --on-download-complete="/path/to/script" -i file

したがって、スクリプトは次のようになります。

#!/bin/bash
notify-send "Finished: $3"
  • $1はaria2cからのgidです。
  • $2はファイルの数です。
  • $3はファイル名です。
1
pLumo