Постоянная ошибка gaierror «Временный сбой в разрешении имени» после работы в течение нескольких часов

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

  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

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


person lipka    schedule 26.12.2011    source источник


Ответы (2)


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

person tsg    schedule 22.06.2012
comment
Получил это недавно, во всей системе открыто только 394 файловых дескриптора (lsof | wc -l). - person Endophage; 27.08.2013

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

import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')
res_init = libc.__res_init
res_init()
person caleb    schedule 23.05.2016
comment
Пожалуйста, не публикуйте один и тот же ответ на несколько вопросов. Если одна и та же информация действительно отвечает на оба вопроса, то один вопрос (обычно более новый) следует закрыть как дубликат другого. Вы можете указать это, проголосовав, чтобы закрыть его как дубликат или, если у вас недостаточно репутации для этого , поднимите флажок, чтобы указать, что это дубликат. В противном случае убедитесь, что вы адаптируете свой ответ к этому вопросу, а не просто вставите один и тот же ответ в несколько мест. - person elixenide; 24.05.2016