3

組み込み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の後に最初の試行を行う場合、すべてが正常に機能します。

エラーが何らかのキャッシングの結果であるかのようです(?!)

アイデアが足りなくなったので、助けていただければ幸いです。

ありがとう

4

1 に答える 1

3

他のライブラリやスクリプトを必要としないソリューションを考案しました。

ディレクトリ内のスクリプトは/etc/network/if-up.d/、ネットワークインターフェイスが起動したときに実行されます。これがリファレンスです。

したがって、これにより、システムが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.dIPが解決された直後に実行されます。

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

とにかく、これは問題に対する十分に単純で堅牢な解決策だと思いました。うまくいけば、それは将来誰か他の人を助けるでしょう。

于 2012-11-13T19:26:55.997 に答える