我有一个在启动时启动的脚本,它可能会在网络完全启动之前启动。
如果以下代码在网络启动之前运行,则会失败,如果稍后再次成功调用它。
即使我将尝试增加到5分钟,它仍会持续到5分钟,然后返回false,即使网络启动后可能不到30秒就会出现网络。
在进行任何尝试之前,有没有办法让下面的代码工作,而不是在以太网没有启动时死掉?
self.TRIES = 60
self.URL="http://www.somedomain.com"
## Do we have internet
def isup():
try:
urllib2.urlopen(self.URL).close()
return True
except urllib2.URLError,e:
pass
return False
## Try the lookup
while (self.TRIES > 0):
if isup():
check()
break
self.TRIES = self.TRIES-1
time.sleep(1)
在OS启动期间(Arch Linux),适配器(本例中为eth0)和网络服务最初未运行,并在启动过程中启动。
如果在网络服务完全启动之前调用它,urllib2(和其他与网络相关的调用)似乎会消失,后续调用将始终导致失败。
这与断开以太网电缆不同,如果您只需拔下以太网电缆并调用该功能(类),它就会成功,但如果在网络服务完全启动之前调用它,它将会失败并且死了。
我可以通过在代码顶部添加time.sleep(30)来解决这个问题,然后为O / S网络服务提供足够的时间来完全启动,并且脚本按预期工作100%。
答案 0 :(得分:2)
使用请求并检查状态代码?
import requests
In [36]: r = requests.get('http://httpbin.org/get')
In [37]: r.status_code == requests.codes.ok
Out[37]: True
In [38]: r.status_code
Out[38]: 200
200
In [33]: r = requests.get('http://httpbin.org/bad')
In [34]: r.status_code
Out[34]: 404
In [35]: r.status_code == requests.codes.ok
Out[35]: False
def isup():
try:
r = requests.get(self.URL)
return r.status_code == requests.codes.ok
except Exception, e:
print e
return False
答案 1 :(得分:0)
你可以这样做:
def isup():
try:
urllib2.urlopen(self.URL).close()
return True
except urllib2.URLError,e:
pass
return False
## Try the lookup
while not isup():
pass #or replace pass with time.sleep(1) or time.sleep(0.5)
check()
答案 2 :(得分:0)
为什么不使用ping
?
def isUp():
ret = os.system("ping -c 1 www.google.com")
return (ret != 0)
注意:这在Windows上不起作用,但你明白了......