Python:网络服务启动前的网络呼叫

时间:2014-05-03 11:09:56

标签: python

我有一个在启动时启动的脚本,它可能会在网络完全启动之前启动。

如果以下代码在网络启动之前运行,则会失败,如果稍后再次成功调用它。

即使我将尝试增加到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%。

3 个答案:

答案 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上不起作用,但你明白了......