我一個嵌入式Linux系統上運行的Python(2.7.2)具有大致此啓動順序:Python的插座的getaddrinfo(GAI)錯誤
0)重新啓動
1)等待2分鐘
2)通過DHCP獲取網絡配置
守護進程使用ntplib獲取當前時間並相應地更新其時鐘。
import ntplib # http://pypi.python.org/pypi/ntplib/
...
self.ntpClient = ntplib.NTPClient()
...
def getDate(self):
try:
logging.info('Sending NTP request to %s' % ('pool.ntp.org'))
response = self.ntpClient.request('pool.ntp.org')
secs = time.localtime(response.tx_time)
logging.info('Response returned')
return secs
except Exception, e:
logging.exception(e)
return RESULT_FAILURE
出現一個問題,如果守護進程開始試圖解決地址信息前的DHCP已經運行(步驟2)。在DHCP客戶端運行之後,即使仍然是一個錯誤。
這裏是個例外:
ERROR:[Errno 2] temporary failure in name resolution.
Traceback (most recent call last):
File "/home/root/ntp_manager/ntp_manager.py", line 34, in getDate
response = self.ntpClient.request('pool.ntp.org')
File "/usr/lib/python2.7/ntplib.py", line 265, in request
addrinfo = socket.getaddrinfo(host, port)[0]
gaierror: [Errno 2] temporary failure in name resolution.
但是,如果程序NtpClient使得其第一嘗試後,DHCP,然後一切工作正常。
這是因爲如果誤差是某種緩存的產品(?!)
我已經江郎才盡,一些幫助,將不勝感激。
謝謝
聽起來像你需要systemd或openrc或類似的東西(基於依賴的啓動腳本)。 – Keith
快速和骯髒的解決方案:嘗試ping一臺互聯網主機。如果如果工程運行DHCP,否則睡一會兒並嘗試再次ping。 –
感謝您的建議,但我已經制定出另一個更簡單的解決方案。 – pjama