인터넷에 처음 연결하기 전에 프로그램이 시작되면 호스트 이름을 확인할 수 없습니다.

인터넷에 처음 연결하기 전에 프로그램이 시작되면 호스트 이름을 확인할 수 없습니다.

이는 다음과 관련이 있습니다.내 스택오버플로우 게시물.

기본적으로 임베디드 시스템(Buildroot 기반)에서 실행되는 Python 스크립트가 있습니다. Python 스크립트는 부팅 시 실행되지만 장치가 셀 신호가 있는 영역에 있지 않을 수 있으므로 그때까지 인터넷 연결이 설정될 것이라고 보장할 수 없습니다(pppd 기반).

컴퓨터에 인터넷 연결이 설정되기 전에 Python 코드가 시작되면 연결이 설정된 후에도 Python 코드가 여전히 이름을 확인할 수 없다는 것을 발견했습니다. [Errno -3] Temporary failure in name resolution소켓이 연결을 시도하는 동안 오류가 발생했습니다. 내가 작동하게 할 수 있는 유일한 방법은 Python 코드를 시작하기 전에 적어도 한 번은 인터넷 연결을 설정하는 것입니다.

인터넷 연결이 설정된 후 Python 코드가 한 번 이상 시스템을 검색하면 시스템에 어떤 일이 발생합니까? 이런 일이 발생하지 않도록 시작할 때 설정할 수 있는 것이 있습니까?

답변1

IP가 시작된 후 pppd에서 제공하는 스크립트 후크를 사용하여 스크립트를 호출할 수 있습니다. 예를 들어 (pppd 맨페이지에서)

/etc/ppp/ip-up
A program or script which is executed when the link is available for 
sending and receiving IP packets (that is, IPCP has come up). It is 
executed with the parameters 

interface-name tty-device speed local-IP-address remote-IP-address ipparam

거기에서 Python 스크립트를 실행하면 문제가 없을 것입니다.

답변2

/etc/resolv.conf대부분의 프로그램은 시작 시 또는 첫 번째 네트워크 액세스 시 한 번만 시스템 DNS 구성을 읽습니다. 구성이 변경되더라도 구성을 다시 읽지 않습니다.

시스템에서 네트워크가 가동되면(구성되지 않은 DNS 서버에서 구성된 DNS 서버로) DNS 구성이 변경되는 것처럼 보입니다. 이는 시스템이 항상 동일한 네트워크에 연결되어 있지 않은 경우 매우 일반적이며 피할 수 없는 현상입니다.

프로그램이 영향을 받지 않도록 하는 한 가지 방법은 로컬 DNS 캐싱 서버를 실행하는 것입니다. 이런 방식으로 애플리케이션의 DNS 구성은 정적(항상 )일 수 nameserver 127.0.0.1있으며 /etc/resolv.confDNS 캐싱 서버는 네트워크 연결을 통해 제공되는 서버에 대해서만 알려주시면 됩니다.DNS특히 임베디드 시스템에서 일반적인 선택입니다(Linux 라우터가 있는 경우 아마도 dnsmasq를 실행 중일 것입니다). dnsmasqBuildroot를 사용하여 자신만의 이미지를 빌드하는 경우 이 패키지를 포함하세요 . dnsmasq 없이 사전 빌드된 이미지가 있는 경우, Buildroot를 통해 dnsmasq를 설치하는 것이 아마도 가장 좋은 옵션일 것입니다. 하지만 저는 Buildroot에 익숙하지 않아서 어떻게 하는지 설명할 수 없습니다.

답변3

구문 분석 테이블을 강제로 새로 고치려면 다음 명령을 실행할 수 있습니다(Linux에서).

import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')
res_init = libc.__res_init
res_init()

관련 정보