Temporary failure in name resolution в журнале службы
Сообщения Temporary failure in name resolution и Name or service not known значат, что имя не превратилось в адрес. При загрузке причина обычно в порядке запуска, в работе — в настройках разрешения имён или в изоляции службы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба стартовала раньше готовности сети
Разрешение имён требует настроенной сети. При загрузке служба может обогнать её и получить отказ на первом же запросе.
-
Не настроен сервер имён
Пустой или неверный /etc/resolv.conf, остановленная служба разрешения имён, недоступный внутренний сервер.
-
Изоляция службы закрывает доступ к разрешению имён
При
PrivateNetwork=yesсети нет вовсе, а приIPAddressDeny=anyбез разрешения сервера имён запросы не проходят. Служба при этом выглядит «сломанной без причины».
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Проверка разрешения имени так, как это видит система.
getent hosts имя-узлаКакие серверы имён используются и по каким интерфейсам.
resolvectl status | head -20Ждёт ли служба готовности сети.
systemctl show myapp.service -p After -p Wants | tr " " "\n" | grep -i netРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Разрешение имён требует настроенной сети. При загрузке служба может обогнать её и получить отказ на первом же запросе.
- Как проверить
-
Посмотрите зависимости службы и время запуска.
systemctl show myapp.service -p After -p Wants | tr " " "\n" | grep -i net systemctl status systemd-networkd-wait-online NetworkManager-wait-online --no-pager | head -8
- Как исправить
-
Добавьте
Wants=network-online.targetиAfter=network-online.target, а также убедитесь, что служба ожидания сети включена.
- Почему происходит
- Пустой или неверный /etc/resolv.conf, остановленная служба разрешения имён, недоступный внутренний сервер.
- Как проверить
-
Посмотрите настройки и проверьте разрешение вручную.
cat /etc/resolv.conf resolvectl status | head -15 getent hosts example.org
- Как исправить
- Исправьте настройки разрешения имён. Для systemd-resolved — проверьте, что resolv.conf ссылается на его заглушку.
- Почему происходит
- При
PrivateNetwork=yesсети нет вовсе, а приIPAddressDeny=anyбез разрешения сервера имён запросы не проходят. Служба при этом выглядит «сломанной без причины».
- Как проверить
-
Посмотрите параметры сетевой изоляции.
systemctl show myapp.service | grep -E "PrivateNetwork|IPAddress|RestrictAddressFamilies"
- Как исправить
- Разрешите доступ к серверу имён или уберите сетевую изоляцию для этой службы.
Пример вывода
Служба обогнала настройку сети при загрузке. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[2100]: fatal: dial tcp: lookup api.internal on 127.0.0.53:53: server misbehaving
myapp[2100]: temporary failure in name resolution
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: myapp.service: Scheduled restart job, restart counter is at 1.
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Цель не достигнута: служба ждёт target, который не наступает Служба не запускается, потому что не достигнута цель из After= или Requires=. Разбор целей multi-user, network-online, graphical.
- nginx: [emerg] host not found in upstream nginx не запускается: не разрешается имя узла из upstream или proxy_pass. Разбор порядка запуска и работы с именами.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Docker: имена не разрешаются внутри контейнера Контейнеры не разрешают имена: конфликт с локальным разрешателем, неверные серверы в daemon.json, отключённый проброс.
Где встречается чаще всего
Источники
-
systemd.special(7)
network-online.target и порядок запуска относительно сети. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено запуском службы до готовности сети.