Python Socket GetAddrInfo(GAI)错误

时间:2012-11-10 01:20:38

标签: python linux sockets embedded-linux ntp

我在嵌入式Linux系统上运行Python(2.7.2)大致有这个启动序列:

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后进行第一次尝试,那么一切正常。

就好像错误是某种缓存的产物(?!)

我已经没有想法了,一些帮助会非常感激。

由于

1 个答案:

答案 0 :(得分:2)

我已经找到了一个不需要任何其他库或脚本的解决方案。

目录中的脚本/etc/network/if-up.d/将在网络接口启动时执行。这是reference

因此,一旦系统配置了DHCP客户端,从而确保我的NTP脚本可以执行到Internet。这是正确的行为,可以避免我遇到的名称解析问题。

我已将这个简单的脚本放在一起(和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

这是对系统上发生的事情的转储。请注意在解析IP后立即执行的行run-parts /etc/network/if-up.d

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

无论如何,我认为这是解决问题的一个非常简单而强大的解决方案。希望将来可以帮助其他人。