2012-11-28 2 views
1

수퍼 유저 영역에 들어 가지 않기를 바랍니다.스크립트 시작 후 케이블이 연결되면 Python이 IP를받지 못함

그래서 시스템 프로세스가 자연히 완전히 제거 된 임베디드 리눅스가 있습니다. 어떤 시스템 프로세스가 물리적 계층을 모니터하고 네트워크 케이블이 연결될 때 dhcp 클라이언트를 시작하는지 잘 모르겠지만 직접 만들었습니다. ¨ 문제는 내가 IP 주소를 가지기 전에 실행중인 http 연결을 사용하여 파이썬 스크립트를 가지고 있다면 절대로 연결을 얻을 수 없다는 것입니다. 내가 유효한 IP를 가지고 후에도, 파이썬은 여전히 ​​스크립트를 다시 시작하지 않고,

그래서 어떻게 파이썬이 사용할 수있는 새 연결을 실현하기 위해 얻을 수

"이름 확인에 임시 오류"가?

또는 네트워크 케이블 연결시 Linux가 정상적으로 실행되는 정상적인 절차가 누락되었습니다.

내가 사용중인 dhcp 클라이언트는 udhcpc이고 파이썬 버전은 2.6입니다. 연결에 httplib 사용.

답변

1

파이썬 모듈 중 하나가 네트워크 상태를 캐시하고 있으므로 최신 설정을 사용하지 않았을 수 있습니다. 네트워크 관련 모듈을 모두 다시로드 해보십시오. 이것의 간단한 예는 다음과 같습니다

import sys, socket, urllib 

for i in [sys, socket, urllib]: 
    reload(i) 

그 수입있어 다른 무엇을 볼 수 sys.modules에 주위를 둘러 작동, 거기 이상의 모듈을 시도하지 않는 경우. 리로딩의 극단적 인 버전은 아래 코드이며 마지막 도랑 노력으로 시도 할 수 있습니다.

코드

reloading 42 modules 
failed to import __main__ 
failed to import encodings.encodings 
failed to import encodings.codecs 
failed to import lazr 
failed to import encodings.__builtin__ 
+0

두 가지 방법 모두 시도했지만 작동하지 않았습니다. – Gjordis

+0

@Gjordis 매우 흥미 롭습니다. 미안 해요. 나는 모두 아이디어가 없습니다. 무슨 일이 일어나는지 우리에게 알려주십시오. 문제를 해결하면 자신의 질문에 대한 답변을 게시 할 수 있습니다. –

2

이 DHCP 클라이언트가 IP를 획득 한 후 업데이트됩니다 /etc/resolv.conf를 캐시 HTTPLIB 것 같은데

import sys 
print 'reloading %s modules ' % len(sys.modules) 
for name, module in sys.modules.items(): 
    try: 
     reload(module) 
    except: 
     print 'failed to import %s' % name 

출력.

IP 주소를 얻을 때까지 기다렸다가 파이썬 스크립트를 호출하는 래퍼 스크립트를 작성하는 것이 좋습니다.

또는 파이썬 스크립트 내에서 이 아닌은 IP 주소를 획득하고 /etc/resolv.conf이 업데이트 될 때까지 소켓 연결을 열려고 시도 할 수 있습니다. HTTPLIB

편집

socket.create_connection() 사용하는 일부 검색 후, I found does cache/etc/resolv.conf. libc의 임베디드 버전이 실제로 캐싱을하고있는 것 같습니다.

SugarLabs' solution 시도해 볼 수는 있지만 그 효과는 말할 수 없습니다.

+0

resolv.conf가 문제 일 수 있습니다. 지금은 IP 접근 방식을 사용 중이며 dns-server가 변경 될 때 스크립트를 다시 시작하지만이 스크립트를 다른 스크립트에 스레드로 포함하려고합니다. IP 주소를 기다리는 것은 처음으로 주소를 검색 할 때 작동합니다. 두 번째로 게이트웨이 변경이라고하면 더 이상 작동하지 않습니다. 어쨌든 답변자 모두 끼어 들어 주셔서 감사합니다 – Gjordis

+0

고마워요! SugarLabs의 솔루션은 나를 위해 완벽하게 작동, 난 그냥 소켓 연결하기 전에 다음과 같은 코드를 추가하는 데 필요한 : '수입하는 ctypes를 시도 : 의 libc = ctypes.CDLL ('libc.so.6으로') res_init = getattr (libc의 '__res_init ') res_init (없음) 제외 : 통과' – Megarushing

0

많은 연구 끝에 glibc 문제인 jedwards가 문제가되는 것으로 보였습니다. 솔루션을 찾지 못했지만 유스 케이스에 대한 해결 방법을 만들었습니다. 하나의 URL 만 사용한다는 것을 고려하여 직접 "resolv.file"을 추가했습니다. PHY가 케이블 연결을보고하면 작은 데몬이 URL의 IP 주소를 가져옵니다.이 IP는 "내 자신의 resolv.conf"에 저장됩니다. 이 파일에서 python 스크립트는 게시물에 사용할 IP를 검색합니다.

정말 좋은 해결책은 아니지만 해결책입니다.