Назад | Перейти на главную страницу

Systemd - запускать службу только после того, как DNS станет доступен

У меня есть пара служб, в первую очередь nginx и ntpd, которые зависят от правильного запуска рабочего разрешения DNS. Прямо сейчас ни одна из этих служб не запускается правильно во время загрузки, но запускается нормально при ручном вмешательстве, когда машина включена, с некоторыми сообщениями в журналах о невозможности разрешения имен.

Это заставляет меня думать, что у меня состояние гонки с systemd. Мои серверы указывают на 127.0.0.1 для своих серверов имен. Привязан к localhost: 53 - это pdns-recursor. Я установил ntp и nginx как WantedBy pdns-recursor в их файлах модулей следующим образом

[Unit]
WantedBy=pdns-recursor.service

Однако я все еще получаю сообщения журнала как в nginx, так и в ntp о невозможности разрешить имена во время загрузки.

Как я могу убедиться, что DNS полностью работает, прежде чем эти службы попытаются запуститься? Я использую Ubuntu 16.04

Aug 09 22:35:25 host.blah ntpd[3574]: restrict: ignoring line 21, address/host 'ntp.blah' unusable.
Aug 09 22:35:26 host.blah ntpd[3574]: restrict: ignoring line 23, address/host 'ntp.blah' unusable.
Aug 09 22:35:28 host.blah ntpd[3574]: restrict: ignoring line 25, address/host 'ntp.blah' unusable.
Aug 09 22:35:29 host.blah ntpd[3574]: restrict: ignoring line 27, address/host 'ntp.blah' unusable.

Попробуйте использовать:

[Unit]
After=network-online.target
Wants=network-online.target

Есть полная рецензия на Unix и Linux а также на FreeDesktop сайт.

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

Я поместил предварительное условие для запуска exec в свои файлы модулей ntp и nginx, чтобы продолжить попытки разрешения имени, прежде чем продолжить.

ExecStartPre=/bin/bash -c 'until host example.com; do sleep 1; done'

Итак, у меня такая же дилемма с удаленным монтируемым диском cifs, который необходимо подключить через DNS FQDN, а не IP. Я попробовал несколько вещей, но пока я должен согласиться с решением Брандо (если не считать написания всей службы Systemd и ее загрузки перед .mount или network-online.target).

Единственная альтернатива Брандо, которую я нашел (которая действительно работает на практике, а не только в теории из страниц руководства), - это ударить муху кувалдой и положить ExecStartPre = в systemd-networkd-wait-online.service:

[Service]
...
ExecStartPre=/bin/sleep 15

Если вам интересно, вы также можете добавить в ExecStart = с помощью --interface =interface_name (и, возможно, --timeout =). Это помогает, потому что у меня есть субинтерфейс vlan, но ожидание онлайн просто отслеживало первый из любых интерфейсов (за исключением петли), которые должны были подключиться к сети. Само по себе это не решило проблему.

Я хотя использовал -o _netdev внутри определения монтирования / etc / fstab исправит это (и теоретически в Systemd удаленные диски по умолчанию ждут network-online.target), но, увы, без кубиков. Перечисление зависимостей полученного файла mnt-remote.mount действительно показывает, что network-online.target является прекурсором, но DNS по-прежнему не работает. Запуск загрузки после службы вручную работает нормально, меня просто облажает какое-то состояние гонки между появлением цели и фактическим разрешением DNS до начала процесса монтирования. Это, а также тот факт, что определение `` онлайн-интерфейса '' варьируется от человека к человеку и от случая к случаю (мой вариант использования требует DNS, другие, очевидно, этого не делают - тема, которая широко освещается на FreeDesktop: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget).

Решение Брандо более элегантно. Для этого также требуется метод пробной ошибки, чтобы минимизировать время сна, но при этом он все равно работает надежно, в зависимости от того, сколько времени потребуется вашему DHCP / DNS / NIC, чтобы все разобраться.

Я выбрасываю это как худшее решение на тот случай, если по какой-то причине Брандо не работает для вас.

Другой способ - пробить запись в файл локальных хостов, но я не был заинтересован в том, чтобы делать это в случае, когда IP-адрес на полное доменное имя меняется относительно часто (аналогичная проблема с простым монтированием его с использованием IP-адреса в первое место).

Я согласен с вашим диагнозом состояния гонки ... если зависимости не настроены явно, systemd будет пытаться запустить эти службы параллельно. Но я не думаю, что директива WantedBy вам поможет, поскольку она влияет на зависимости установки, а не на зависимости при запуске. эта страница руководства.

Я думаю, что вы ищете комбинацию директивы Wants и директивы After. Для каждого из ntp и nginx, я думаю, вы хотите добавить в свой файл модуля следующее:

Wants=pdns-recursor.service
After=pdns-recursor.service

Эти два варианта должны гарантировать, что служба DNS запускается до службы ntp / nginx, что, надеюсь, должно решить вашу проблему.

Будучи человеком с поясом и подтяжками, я бы рекомендовал поместить ваше имя / IP-адрес в ваш файл / etc / hosts; таким образом другие службы могут запуститься, даже если ваш DNS не работает. Если вы действительно хотите попробовать использовать DNS вместо статических файлов, вы можете изменить порядок разрешения.