2012-11-10 58 views
3

我一個嵌入式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,然後一切工作正常。

這是因爲如果誤差是某種緩存的產品(?!)

我已經江郎才盡,一些幫助,將不勝感激。

謝謝

+2

聽起來像你需要systemd或openrc或類似的東西(基於依賴的啓動腳本)。 – Keith

+0

快速和骯髒的解決方案:嘗試ping一臺互聯網主機。如果如果工程運行DHCP,否則睡一會兒並嘗試再次ping。 –

+0

感謝您的建議,但我已經制定出另一個更簡單的解決方案。 – pjama

回答

2

我已經制定了一個不需要任何其他庫或腳本的解決方案。

當網絡接口出現時,將執行目錄中的腳本/etc/network/if-up.d/。這是一個reference

因此,這可以確保一旦系統配置了DHCP客戶端並因此連接到互聯網,就可以執行我的NTP腳本。這是避免我遇到的名稱解析問題的正確行爲。

我把這個簡單的腳本放在一起(它和chmod +x它!)它檢查網絡方法是dhcp,並且經常會初始化我的NTP守護進程。

#! /bin/sh 
# ntp time-sync manager python daemon starter script 

set -e 

# ... Some Stuff Omitted Here ... 

if [ "$METHOD" = dhcp ]; then 
    echo -n "Starting $DESC..." 
    start-stop-daemon --start --verbose --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS 
    echo "METHOD: $METHOD" 
    echo "IFACE: $IFACE" 
fi 

echo "Exiting if-up.d/ntp_manager" 
exit 0 

這是系統上發生的轉儲。請注意以下行:run-parts /etc/network/if-up.d在解決IP後立即執行。

Reconfiguring network interfaces eth0 with DHCP... cat: can't open '/var/run/udh 
cpc.eth0.pid': No such file or directory 
run-parts /etc/network/if-pre-up.d 
ifconfig eth0 up 
udhcpc -R -b -p /var/run/udhcpc.eth0.pid -i eth0 
udhcpc (v1.13.2) started 
Sending discover... 
Sending discover... 
Sending select for 192.168.1.145... 
Lease of 192.168.1.145 obtained, lease time 86400 
adding dns 192.168.1.1 
run-parts /etc/network/if-up.d 
Starting NTP Time Manager...Daemon PID 1059 
Redirecting serivice startup output to /home/root/Connect/log/ntp_manager_daemon.log 
METHOD: dhcp 
IFACE: eth0 
Exiting if-up.d/ntp_manager 

無論如何,我認爲這是一個足夠簡單和強大的解決方案的問題。希望它能幫助未來的其他人。