web-dev-qa-db-ja.com

--timeoutと--triesを一緒に使用してwget

このコマンドが終了するまでにどれくらいかかると思いますか?

wget --timeout=1 --tries=2 "http://www.google.com:81/not-there"

私は1秒のタイムアウトを期待し、2回の試行は2秒を意味しますが、6.025秒かかります

wget --timeout=1 --tries=2 "http://www.google.com:81/not-there"
--2017-04-27 16:49:12--http://www.google.com:81/not-there
Resolving www.google.com (www.google.com)... 209.85.203.105, 209.85.203.103, 209.85.203.99, ...
Connecting to www.google.com (www.google.com)|209.85.203.105|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.103|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.99|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.104|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.106|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.147|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|2a00:1450:4009:80d::2004|:81... failed: Network is unreachable.

終了する前に6回試行する理由がわかりません。

triesは再試行用のようです。 --retry-connrefusedを設定すると、少なくとも再試行は行われますが、それでも合計所要時間は期待したものではありません。タイムアウトの試行回数を決定できるようにしたいと思います。

編集

@Socowiからの提案の後、retry-connrefusedと組み合わせてwaitretryを使用してみましたが、同じ動作が得られました。

$ wget --timeout=1 --waitretry=0 --tries=2 --retry-connrefused "http://www.google.com:81/not-there"
--2017-04-27 20:29:47--  http://www.google.com:81/not-there
Resolving www.google.com (www.google.com)... 2a00:1450:400b:c00::68, 209.85.203.99, 209.85.203.147, ...
Connecting to www.google.com (www.google.com)|2a00:1450:400b:c00::68|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.99|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.147|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.103|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.104|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.106|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.105|:81... failed: Connection timed out.
Retrying.

--2017-04-27 20:29:54--  (try: 2)  http://www.google.com:81/not-there
Connecting to www.google.com (www.google.com)|2a00:1450:400b:c00::68|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.99|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.147|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.103|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.104|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.106|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.105|:81... failed: Connection timed out.
Giving up.

編集2

2つの同一のコマンドの動作が異なると、本当に混乱しました。

root@8c59d6dd05fe:/var/www/html# wget --timeout=1 --waitretry=0 --tries=2 --retry-connrefused "http://www.google.com:81/not-there"
converted 'http://www.google.com:81/not-there' (ANSI_X3.4-1968) -> 'http://www.google.com:81/not-there' (UTF-8)
--2017-04-27 19:50:28--  http://www.google.com:81/not-there
Resolving www.google.com (www.google.com)... 216.58.211.164, 2a00:1450:4009:805::2004
Connecting to www.google.com (www.google.com)|216.58.211.164|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|2a00:1450:4009:805::2004|:81... failed: Cannot assign requested address.
Retrying.

--2017-04-27 19:50:29--  (try: 2)  http://www.google.com:81/not-there
Connecting to www.google.com (www.google.com)|216.58.211.164|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|2a00:1450:4009:805::2004|:81... failed: Cannot assign requested address.
Giving up.

root@8c59d6dd05fe:/var/www/html# wget --timeout=1 --waitretry=0 --tries=2 --retry-connrefused "http://www.google.com:81/not-there"
converted 'http://www.google.com:81/not-there' (ANSI_X3.4-1968) -> 'http://www.google.com:81/not-there' (UTF-8)
--2017-04-27 19:50:35--  http://www.google.com:81/not-there
Resolving www.google.com (www.google.com)... 209.85.203.104, 209.85.203.147, 209.85.203.106, ...
Connecting to www.google.com (www.google.com)|209.85.203.104|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.147|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.106|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.103|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.105|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.99|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|2a00:1450:400b:c03::68|:81... failed: Cannot assign requested address.
Retrying.

--2017-04-27 19:50:41--  (try: 2)  http://www.google.com:81/not-there
Connecting to www.google.com (www.google.com)|209.85.203.104|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.147|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.106|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.103|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.105|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|209.85.203.99|:81... failed: Connection timed out.
Connecting to www.google.com (www.google.com)|2a00:1450:400b:c03::68|:81... failed: Cannot assign requested address.
Giving up.

私は少し夢中になっていると思っていましたが、@ Socowiがコメントで指摘したときのみ、IPが再試行されるたびにクリックするのが異なっていました。返される可能性のあるIPの数に依存します。私が見ていたマジックナンバー7(再試行)は、IPオプションの番号でした。特定のIPを1つだけ選択すると、1回だけ試行されます。

9
mickadoo

間違った再試行回数

wgetの出力の2行目に見られるように、wgetはURLを複数のIPアドレスに解決しているようです。各IPは、指定されたタイムアウトでテストされます。残念ながら、DNSルックアップを1つのアドレスに制限したり、すべてのIPの合計タイムアウトを設定したりするオプションは見つかりませんでした。ただし、URLの代わりに_"<googles ip address>:81/not-there"_を使用することもできます。

タイムアウトが長すぎるようです

すでにわかっているように、_--retry-connrefused_を設定すると、"connection refused"エラーの後でもwgetを再試行できます。指定されたタイムアウトは各再試行に使用されますが、再試行の間は、各再試行後に長くなる一時停止があります。

_wget --timeout=1 --tries=5 --retry-connrefused URL
_

のようなことをする

_try to connect for 1 second
failed -> wait 1 second
try to connect for 1 second
failed -> wait 2 seconds
try to connect for 1 second
failed -> wait 3 second
try to connect for 1 second
failed -> wait 4 second
try to connect for 1 second
_

したがって、コマンドにはtries * timeout + 1 + 2 + ... + (tries - 1)秒かかります。この動作は、オプションの下の_man wget_で指定されているため、変更できます:)

-waitretry = seconds
Wgetが取得のたびに待機するのではなく、失敗したダウンロードの再試行の間にのみ待機する場合は、このオプションを使用できます。 Wgetは線形バックオフ、指定されたファイルの最初の失敗から1秒待ってから、そのファイルの2番目の失敗から2秒待つを指定した最大秒数まで使用します。

デフォルトでは、Wgetは10秒の値を想定します。

次のようなものを使用したいと思います

_wget --timeout=1 --waitretry=0 --tries=5 --retry-connrefused URL
_

これにより、2回の再試行間の一時停止がなくなり、合計時間が_timeout * tries_になります。

10
Socowi