Intereting Posts
Могу ли я использовать разрешения или возможности для ограничения создания файлов в каталоге, не ограничивая создание каталогов? Команда grep для отображения того же слова с разными написаниями Изучение того, как создать собственное ядро ​​Linux Создание нового initrd без установки ядра Моя новая клавиатура не имеет ключа трубы kde install уничтожает рабочий стол gnome sed удалять пространство Сетевой интерфейс Debian больше не работает после обновления / обновления Каждые несколько минут меняется ориентация экрана Emacs показывает восьмеричные escape-последовательности для некоторых символов в файле UTF-8 Как подключить различные интерфейсы WiFi: 1 для внешнего 1 для внутреннего Глобальные ярлыки клавиш в Ubuntu 14.04 Как настроить глобальный интервал между попытками входа в систему SSH? Как диагностировать потенциальные проблемы со вспышкой JFFS2? Fedora 18: не удается разрешить хосты

Программа не может разрешить имя хоста, если она запущена перед первым успешным подключением к Интернету

Это связано с сообщением stackoverflow, которое я опубликовал .

В основном у меня есть скрипт Python, который я запускаю во встроенной системе (Buildroot-based). Сценарий python запускается при запуске, но я не могу гарантировать, что подключение к интернету будет к тому времени (на основе pppd), потому что устройство может не находиться в зоне с сигналом мобильного телефона.

Я обнаружил, что если код python запускается до того, как на компьютере установлено соединение с Интернетом, даже после установления соединения код python все еще не может разрешить имена. Я получаю [Errno -3] Temporary failure in name resolution ошибке [Errno -3] Temporary failure in name resolution при [Errno -3] Temporary failure in name resolution сокета подключиться. Единственный способ заставить его работать – установить подключение к интернету хотя бы один раз, прежде чем я запустим код python.

Какие изменения вносятся в систему после того, как интернет-соединение установлено хотя бы один раз, когда код Python может быть найден? Есть ли что-то, что я могу настроить при загрузке, чтобы этого не произошло?

Большинство программ читают системную конфигурацию DNS (в /etc/resolv.conf ) только один раз при запуске или при первом доступе к сети. Они не перечитывают конфигурацию, если она изменяется.

Похоже, что в вашей системе настройка DNS изменяется, когда сеть идет вверх (возможно, изменяется от неустановленной конфигурации сервера DNS). Это очень часто и неизбежно, если система не всегда подключена к одной сети.

Способ гарантировать, что программы не будут затронуты, – запустить локальный сервер кэширования DNS. Таким образом, конфигурация DNS для приложений может быть статичной (всегда nameserver 127.0.0.1 в /etc/resolv.conf ), и только сервер кеширования DNS должен быть проинформирован о серверах, предоставляемых сетевым подключением. Dnsmasq – общий выбор, особенно на встроенных системах (если у вас есть Linux-маршрутизатор, он, вероятно, запускает dnsmasq). Если вы создаете свой собственный образ с помощью Buildroot, включите пакет dnsmasq . Если у вас есть готовое изображение без dnsmasq, установка dnsmasq через Builtroot может быть лучшим вариантом, но я не знаком с Buildroot, поэтому я не могу объяснить, как это сделать.

Вы можете использовать перехватчики скриптов, которые предоставляет pppd, чтобы вызвать ваш скрипт после того, как ip поднялся. Например (из man-страницы pppd)

 /etc/ppp/ip-up A program or script which is executed when the link is available for sending and receiving IP packets (that is, IPCP has come up). It is executed with the parameters interface-name tty-device speed local-IP-address remote-IP-address ipparam и /etc/ppp/ip-up A program or script which is executed when the link is available for sending and receiving IP packets (that is, IPCP has come up). It is executed with the parameters interface-name tty-device speed local-IP-address remote-IP-address ipparam 

Когда вы начинаете свой скрипт python изнутри, вы должны быть в порядке.

Чтобы принудительно обновить таблицу разрешений, вы можете запустить это (в linux):

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