我有.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执行中的一点点冗长也不会造成伤害。
是的,我不知道为什么会挂起来。浏览器可以打开这些页面,同样的命令也可以从终端逐行运行。答案 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,或者如果你认为它只是其他因素之一就可以设置一个特定的超时