如何避免在bash中挂wget

时间:2014-04-22 07:21:06

标签: bash wget

我有.sh脚本,其中包括以下方式来保证Google的货币汇率:

printf 'Bash: Going to get exchange rates'
echo    
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=aud" |  sed '/res/!d;s/<[^>]*>//g' > exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=jpy" |  sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=hkd" |  sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=nzd" |  sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=eur" |  sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=gbp" |  sed '/res/!d;s/<[^>]*>//g' >> exrates

mv /home/stan/perl/2014/scripts/exrates /home/stan/perl/2014/exrates/exrates

printf 'Bash: Got exchange rates'
echo

然而,偶尔会有脚本挂起。我不介意每次运行都不更新这些费率,如果它挂起我想完全跳过这一步,但是怎么样?

我应该在“if”语句中添加什么来检查wget是否可以及时获取数据或将永久获取数据? wget执行中的一点点冗长也不会造成伤害。

是的,我不知道为什么会挂起来。浏览器可以打开这些页面,同样的命令也可以从终端逐行运行。

3 个答案:

答案 0 :(得分:4)

我认为它会挂起,因为您有许多HTTP请求被发送到脚本中的单个主机。有问题的主机不太喜欢,它开始阻止来自您IP地址的请求。

一个简单的解决方法是在请求之间放置sleep。您还可以使用函数:

getExchangeRates() {
  wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=$1" |  sed '/res/!d;s/<[^>]*>//g' >> exrates
  sleep 10   # Adding a 10 second sleep
}

并通过将参数传递给函数来调用它:

getExchangeRates aud

也可以在各种货币的循环中调用该函数:

for currency in aud jpy hkd nzd eur gpb; do
  getExchangeRates $currency
done

答案 1 :(得分:3)

仅在wget语句中使用超时

wget --timeout 10 <URL>

超时以秒为单位 并把一些     睡在两个wgets之间

答案 2 :(得分:2)

wget有各种超时选项。从手册页

   --timeout=seconds
       Set the network timeout to seconds seconds.  This is equivalent to
       specifying --dns-timeout, --connect-timeout, and --read-timeout,
       all at the same time.

所以你可以简单地设置--timeout,或者如果你认为它只是其他因素之一就可以设置一个特定的超时