2012-11-10 30 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 

无论如何,我认为这是一个足够简单和强大的解决方案的问题。希望它能帮助未来的其他人。