2011-12-26 9 views
6

Ho uno script Python a esecuzione prolungata, lanciato con upstart. Questo script fa un sacco di richieste. Tutto funziona bene in un primo momento, ma dopo qualche ora mi metto in modo permanente ottenendo il seguente errore per ogni richiesta:Gaierror permanente 'Errore temporaneo nella risoluzione dei nomi' dopo aver funzionato per alcune ore

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 

Questo non è un problema con la risoluzione dei nomi o DNS, perché un semplice riavvio delle correzioni di applicazione di questo problema .

Ho provato sia Python 2.6 a 2.7 e si verifica la stessa situazione.

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

ci sono stati alcuni post con questo problema, ma nessuno con una spiegazione semplice o una soluzione:

risposta

1

I pensa che questo accada quando entri in una condizione di "troppi file aperti". La prossima volta che questo accadrà, prova a vedere quanti descrittori di file sono stati aperti dal tuo script.

+0

stato sempre di recente, solo 394 descrittori di file aperti attraverso tutto il sistema ('lsof | wc -l'). – Endophage

0

La causa principale è che /etc/resolv.conf viene letto solo all'avvio di python. Per forzare un aggiornamento della tabella di determinazione, è possibile eseguire questo (su Linux):

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

Si prega di non pubblicare la stessa risposta a più domande. Se la stessa informazione risponde a entrambe le domande, allora una domanda (di solito quella più nuova) dovrebbe essere chiusa come duplicato dell'altro. Puoi indicarlo [votando per chiuderlo come duplicato] (http://stackoverflow.com/help/privileges/close-questions) o, se non hai abbastanza reputazione per quello, [alzare una bandiera] (http://stackoverflow.com/help/privileges/flag-posts) per indicare che si tratta di un duplicato. Altrimenti, assicurati di adattare la risposta a * questa * domanda e non incollare la stessa risposta in più punti. –

Problemi correlati