У меня есть пара служб, в первую очередь 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 вместо статических файлов, вы можете изменить порядок разрешения.