Постоянный gaierror «Временный сбой в разрешении имен» после нескольких часов работы - PullRequest
6 голосов
/ 26 декабря 2011

У меня есть долго работающий скрипт на python, запущенный с помощью upstart. Этот скрипт делает довольно много запросов. Сначала все работает хорошо, но через несколько часов я постоянно получаю следующую ошибку для каждого запроса:

  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

Это не проблема с разрешением имен или DNS, потому что простой перезапуск приложения устраняет эту проблему.

Я пробовал оба Python 2.6 и 2.7, и возникает та же самая ситуация.

Я бегу Linux 2.6.35-30-virtual #61-Ubuntu SMP Tue Oct 11 18:26:36 UTC 2011 x86_64 GNU/Linux

Было несколько сообщений с этой проблемой, но ни одно с простым объяснением или решением:

Ответы [ 2 ]

1 голос
/ 22 июня 2012

Я думаю, что это происходит, когда вы попадаете в состояние «слишком много открытых файлов».В следующий раз, когда это произойдет, попробуйте посмотреть, сколько файловых дескрипторов открыто вашим скриптом.

0 голосов
/ 24 мая 2016

Основная причина в том, что /etc/resolv.conf читается только при запуске python. Чтобы принудительно обновить таблицу разрешения, вы можете запустить это (в Linux):

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