2011-12-26 27 views
6

Mam od dawna działający skrypt w języku Python, uruchamiany przy pomocy usługi upstart. Ten skrypt zawiera sporo żądań. Wszystko działa dobrze na początku, jednak po kilku godzinach zaczynam stale otrzymuję następujący błąd na każde żądanie:Permanentny gaierror "Tymczasowa awaria w rozpoznawaniu nazw" po uruchomieniu przez kilka godzin

File "/opt/a/a-env/local/lib/python2.7/site-packages/atom/client.py", line 119, in request 
    File "/opt/a/a-env/local/lib/python2.7/site-packages/atom/http_core.py", line 420, in request 
    File "/opt/a/a-env/local/lib/python2.7/site-packages/atom/http_core.py", line 489, in _http_request 
    File "/usr/lib/python2.7/httplib.py", line 931, in endheaders 
    File "/usr/lib/python2.7/httplib.py", line 794, in _send_output 
    File "/usr/lib/python2.7/httplib.py", line 756, in send 
    File "/usr/lib/python2.7/httplib.py", line 1134, in connect 
    File "/usr/lib/python2.7/socket.py", line 553, in create_connection 
gaierror: [Errno -3] Temporary failure in name resolution 

To nie jest problem z rozpoznawaniem nazw lub DNS, ponieważ prosty restart poprawek aplikacji Ten problem .

Próbowałem już zarówno Python 2.6 a 2.7, jak i tej samej sytuacji.

biegnę Linux 2.6.35-30-virtual #61-Ubuntu SMP Tue Oct 11 18:26:36 UTC 2011 x86_64 GNU/Linux

Odnotowano kilka postów z tym problemu, ale żaden z prostego wyjaśnienia lub roztworu:

Odpowiedz

1

I wydaje się, że dzieje się tak, gdy pojawi się warunek "zbyt wielu otwartych plików". Następnym razem, jak to się dzieje, spróbuj sprawdzić, ile deskryptorów plików otworzy twój skrypt.

+0

dostaję ją niedawno, zaledwie 394 deskryptory plików otwarte w poprzek całego systemu ('lsof | wc -l'). – Endophage

0

Główną przyczyną jest to, że plik /etc/resolv.conf jest odczytywany tylko podczas uruchamiania Pythona. Aby wymusić odświeżenie tabeli postanowienie, można uruchomić ten (w systemie Linux):

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

Proszę nie zamieszczać tej samej odpowiedzi na wiele pytań. Jeśli te same informacje rzeczywiście odpowiadają na oba pytania, jedno pytanie (zwykle nowsze) powinno zostać zamknięte jako duplikat drugiego. Możesz to wskazać przez [głosowanie, aby zamknąć je jako duplikat] (http://stackoverflow.com/help/privileges/close-questions) lub, jeśli nie masz wystarczającej reputacji, [podnieść flagę] (http://stackoverflow.com/help/privileges/flag-posts), aby wskazać, że jest duplikatem. W przeciwnym razie należy dostosować odpowiedź do * tego * pytania i nie wklejać tej samej odpowiedzi w wielu miejscach. –