Я пытаюсь создать системный сервис на Debian Jessie. Мне нужно, чтобы начать после network-online.target
достижения.
Проблема в том, что происходит network-online.target
пожар, в то время как network.target
мои интерфейсы еще не настроены, просто запущен запрос DHCP.
Похоже, что эта проблема специфична для Debian, потому что он использует устаревшую конфигурацию сети.
Как обойти эту проблему или как заставить network-online.target
работать?
debian
systemd
systemd-networkd
10robinho
источник
источник
systemctl list-dependencies network-online.target
? Также обратите внимание, чтоnetwork-online.target
необязательно означает, что есть доступ в Интернет. Смотрите эту страницу для получения дополнительной информации.network-online.target ● └─systemd-networkd-wait-online.service
я уже прочитал эту страницу, я понимаю основную концепцию там, но все же очень странно не иметь определенной точки, где могут запускаться критически важные для сети службы. По крайней мере, он может ждать правильного назначения DHCP.network-online.target
зависит только отsystemd-networkd-wait-online.service
высказывания, что оно готово. Это не зависит от того, что NetworkManager говорит, что он готов, и не проверяет, чтоifup
все ссылки были успешно запущены (если вы используете этот метод для настройки сети). Ubuntu, с другой стороны, зависит отifup
NetworkManager, но не отsystemd-networkd-wait-online.
./etc/network/interfaces
системные.network
файлы или NetworkManager?network-online.target
иnetwork.target
срабатывают сразу послеifup
. Я использую Debian по умолчанию, поэтому/etc/network/interfaces
с адресом DHCP. Похоже, что networkd может быть лучшим решением, но это не так просто реализовать.Ответы:
Поскольку вы используете
/etc/network/interfaces
, вам понадобится сервис systemd для контроля состояния каждого интерфейса. Проверьте, есть ли у вас/lib/systemd/system/ifup-wait-all-auto.service
(установленныйifupdown
пакет в Ubuntu 15.04). Если нет, то создайте/etc/systemd/system/ifup-wait-all-auto.service
и вставьте следующее:Это служебный файл, представленный в системе Ubuntu 15.04, но с
[Install]
добавленным разделом, чтобы немного упростить процесс . Я надеюсь, что поведениеifup
в Ubuntu 15.04 такое же, какifup
в Debian Jessie. Если нет, то некоторые изменения будут необходимы (особенно с последней строкой).Тогда беги
sudo systemctl enable ifup-wait-all-auto.service
. После перезагрузки компьютера вы должны увидеть, чтоnetwork-online.target
оно достигнуто после включения интерфейсов (по крайней мере).источник
ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'
. Это зависит от того,hostname
чтобы проверить, был ли назначен IP-адрес.ifup-wait-all-auto.service
вifupdown
версии было удалено0.8.5ubuntu1
: «Drop ifup-wait-all-auto.service. Это было реализовано более элегантно, сделав network-online.target Wants =Внимание! Только что выяснил это на распбианской Джесси: удалите ВСЕ закомментированные строки в / etc / network interfaces, и это будет работать! Кажется, это ошибка синтаксического анализа =) В моем конкретном случае я оставил комментарий
iface eth0 inet dhcp
и просто забыл об этом несколько лет назад, но после обновления до Raspbian Jessie и перестройки ядра у меня появилось очень странное поведение: он использовал DHCP и отказался сделать настройку из / etc / network / interfaces. Так что я удалил это из любых комментариев - просто рабочие строки, перезагрузка - и это работает! НЕ ТРЕБУЕТСЯ ЗАПИСЬ / РЕДАКТИРОВАНИЕ СКРИПТА!источник
/etc/network/interfaces
файл - он запустится, если он все еще там.Согласно https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ рекомендуемый способ запуска службы ПОСЛЕ сетевого подключения - это использовать « network-online.target » в файле .service :
Однако после использования « network-online.target » и сбоя моего сервиса из-за того, что работа в сети была не на полном уровне, я обнаружил, что есть ошибка ( https://github.com/coreos/bugs/issues/1966 ) с ней: не гарантируется быть на 100% непогрешимым.
Действительно, когда используются инструменты динамической настройки сети, такие как « NetworkManager », как в этом случае, состояние сети никогда не может быть на 100% точным или предсказуемым. Как видно из ссылки, описывающей ошибку, « network-online.target » может вести себя непоследовательно в зависимости от различных приложений, с которыми он используется.
Обходной путь :
Вам нужно проанализировать порядок запуска услуг и использовать тот, который запускается позже, чем « network-online.target »:
Это итеративный процесс, меняющий цели постепенно на более поздние и поздние сервисы, пока вы не найдете тот, который обеспечивает уровень сети и ваша служба запускается без ошибок. В моем собственном случае мне даже пришлось вставить
sleep 10
в мой скрипт службу SystemD.источник
Однажды я нашел ответ на Github, который решил эту проблему, постоянно пытаясь пропинговать сервер. Только когда пинг проходит, сервис продолжается:
Я заменил
google.com
свой собственный сервер, потому что мой основной сценарий должен был подключиться к моему серверу.источник