簡體   English   中英

Python:網絡服務啟動之前的網絡調用

[英]Python: Network calls before network service is up

我有一個在啟動時啟動的腳本,有可能在網絡完全啟動之前啟動它。

如果以下代碼在聯網之前運行,則失敗;如果稍后再次調用,則成功。

即使我將嘗試次數增加到5分鍾,它也將持續到5分鍾,然后返回false,即使在腳本啟動后不到30秒就啟動了網絡連接。

有沒有一種方法可以使以下代碼正常工作,並且在以太網未啟動的情況下不會消失,而不是在嘗試之前僅休眠1分鍾?

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)

編輯

在操作系統啟動期間(Arch Linux),適配器(在這種情況下為eth0)和網絡服務最初並未運行,而是在啟動過程中啟動。

如果在網絡服務完全啟動之前調用urllib2(以及其他與網絡相關的調用),則似乎會死掉,並且后續調用將始終導致失敗。

這與僅斷開以太網電纜不同,如果您只是拔下以太網電纜並調用該函數(類),則它將成功,但是如果在網絡服務完全啟動之前被調用,它將失敗並死亡。

我可以通過在代碼頂部添加time.sleep(30)來解決此問題,這將為O / S網絡服務充分啟動提供足夠的時間,並且腳本可以按預期的方式工作100%。

使用請求並檢查狀態碼?

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

您可以這樣做:

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()

為什么不使用ping

def isUp():
    ret = os.system("ping -c 1 www.google.com")
    return (ret != 0)

注意:這在Windows上無法正常使用,但您有主意...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM