Заставьте сценарий выполняться после того, как сети запустятся?

Наилучший вариант состоит в том, чтобы использовать SuperGrub от Загрузки http://www.supergrubdisk.org/ запись ISO для сочинения диска или CD и начальной загрузки в живой режим. Следуйте экранным инструкциям GUI, чтобы переустановить и зафиксировать личинку.

108
07.11.2014, 17:12
7 ответов

Используйте После в разделе [Устройство] для указания того, что должно быть запущено до начала собственного обслуживания. (Это большая часть предыдущего ответа верно.)

Чтобы запустить вашу службу после того, как сеть будет готова, используйте сетевой объект, который должен применяться независимо от того, используете ли вы NetworkManager, систему conf.d/netctl в Arch, или какую-либо другую службу, о которой systemd знает.

[Unit]
#.....
After=network.target

Краткий обзор подтвердит, что каждая другая служба в вашей системе, которая полагается на сетевое подключение, содержит эту директиву.

Она также переносится на любой дистрибутив, использующий systemd. Ваш файл устройства будет таким же для Arch, Fedora, RHEL 7, будущих версий Debian....


Службы, которые запускают сетевое подключение, такие как сценарии Arch или ваши собственные, должны указать это в своих собственных файлах .

[Unit]
Wants=network.target
Before=network.target
3
27.01.2020, 19:29

В зависимости от конфигурации сети systemd

Очень легко повлиять на заказ устройства systemd. С другой стороны, необходимо быть внимательным к тому, что гарантирует готовое устройство.

Настройте свою службу

на текущие системы, Заказ после network.target только гарантирует, что сетевая служба была запущена, а не то, что есть какая-то реальная конфигурация. Для этого нужно заказать после network-online.target и подключить его.

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

Для совместимости со старыми системами, вам также может понадобиться сделать заказ после network.target.

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

Это для файла устройства вашей службы и для systemd.

Реализация в текущих версиях программного обеспечения

Теперь необходимо убедиться, что network-online.target работает так, как ожидается (или что вы, по крайней мере, можете использовать network.target).

Текущая версия NetworkManager предлагает NetworkManager-wait-online.service, который втягивается network-online.target и, таким образом, вашим сервисом. Эта специальная служба обеспечивает ожидание того, что все настроенные соединения будут автоматически запущены, откажут или выйдут из строя.

Текущая версия systemd-networkd блокирует выполнение функции до тех пор, пока все устройства не будут настроены в соответствии с заданным параметром. Это упрощается тем, что в настоящее время она поддерживает только те конфигурации, которые применяются во время загрузки (в частности, время запуска `системно-сетевого сервиса'').

Для полноты, служба /etc/init.d/network в Fedora, как интерпретируется текущими версиями systemd, блокирует network.target и, таким образом, косвенно блокирует network-online.target и вашу службу. Это пример реализации, основанной на сценарии.

Если ваша реализация, основанная на демоне или сценарии, будет вести себя как одна из вышеперечисленных служб сетевого управления, она отложит запуск вашей службы до тех пор, пока конфигурация сети не будет либо успешно завершена, либо не будет неудачной по уважительной причине, либо не завершится по истечении разумного периода времени.

Возможно, вы захотите проверить, работает ли netctl таким же образом, и эта информация будет ценным дополнением к данному ответу.

Влияния в старых версиях программного обеспечения

Не думаю, что вы увидите достаточно старую версию systemd, в которой это не сработает. Но Вы можете проверить, что по крайней мере network-online.target существует и что он упорядочен после network.target.

Ранее NetworkManager гарантировал только одно соединение. И даже для того, чтобы это сработало, необходимо явно включить службу NetworkManager-wait-online.service. Это было давно исправлено в Fedora, но только недавно было применено вверх по течению.

systemctl enable NetworkManager-wait-online.service

Примечания к реализации network.target и network-online.target

Вам никогда не нужно делать ваше программное обеспечение зависимым от NetworkManager.service или NetworkManager-wait-online.service или любых других специфических сервисов. Вместо этого все службы сетевого управления должны быть расположены в порядке очереди перед network.target и опционально network-online.target.

Служба сетевого управления на основе простого сценария должна закончить настройку сети перед выходом и упорядочить себя перед network.target и, таким образом, опосредованно перед network-online.target.

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Служба сетевого управления на основе демона также должна упорядочить себя до network.target, хотя это не очень полезно.

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

Служба, ожидающая завершения работы демона, должна упорядочить себя после конкретной службы и до network-online.цель. Она должна использовать Requisite на службе демона, чтобы она немедленно отказала, если соответствующая служба управления сетью не используется.

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Пакет должен установить symlink для службы ожидания в каталоге want для network-online.target, чтобы его могли использовать службы, которые хотят ждать сконфигурированной сети.

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

Соответствующая документация

Заключительные замечания

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

134
27.01.2020, 19:29

Я предполагаю, что я могу изменить точку, на которой скрипт работает, возился с параметром просязания

, который будет иметь противоположный эффект того, что вы хотите. Из MAN SYSTEMD.UNIT :

Weymentby =, требуется, требуется =

[...] символическая ссылка создана в .wants / или .requires / каталог каждого из перечисленных единиц, когда Этот агрегат устанавливается SystemCTL Enable. Это влияет, что зависимость типа хочет = Или требуется = добавляется из перечисленного блока к текущему блоку .

На основании этого мы можем видеть правильную опцию подразделения «Хочет» или «требует»; На основании описания тех, «требуется», вероятно, является правильным, с добавлением «после», чтобы обеспечить не только то, что сетевая служба будет запускаться, но она выполняется до этого устройства.

Ни один из вариантов устройства, AFAIK, не может включать в себя условие, что начало Perquisite должен выполнить или достичь определенного момента (сетевая служба, вероятно, является услугой демона), только что его запускается . Имея в виду, что вы можете сделать свой скрипт тип = выпукать и бросить здоровую задержку (скажем, 30 секунд) или какой-то цикл выхода на успех, включая задержку, чтобы сделать уверен, что у вас первый аренду DHCP.

4
27.01.2020, 19:29

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

[Unit]
After=network.target

Ваш сервис должен связываться на интерфейсе подстановки. Если он использует активацию сокета (рекомендуется), или если она является локальной только, вы можете полностью игнорировать целевые цели сети.

Если ваш сервис действует как клиент, или будет однообразным, это более подходит:

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

до Systemd 213 , Network-Online.target нуждается в рабочем положении Pavel (вам нужно Вручную включить службу, которая будет ждать, пока сеть будет задуматься). Насколько SystemD 213 это делается по умолчанию. SystemD-Networkd-wait-online ждет хотя бы одного адреса (маршрутизируемый, либо канал - локальный), который должен быть настроен на интерфейсе без обратной связи.

Настройка SystemD-Networkd, NetworkManager или Equivalent является независимой задачей. DHCP (для IPv4) и NDP (для IPv6), как правило, работают из коробки, но вы должны настроить их так, чтобы ваше точное определение «сеть работает» - это то, что триггеры Network-online.target Отказ

Документация:

8
27.01.2020, 19:29

Я хотел добавить точку к этой статье. В настоящее время (лето 2015 г.) в RHEL7 / CentOS 7 network-online.target неправильно настроен перед подключением сети IPv6, поэтому демоны, у которых есть

Wants=network-online.target
After=network-online.target

в определении службы, которые также явно связываются с адресами IPv6, вероятно, будут запущены до того, как IPv6 будет запущен. запущены и работают, что приводит к их сбою.

1
27.01.2020, 19:29

Вы можете использовать After в разделе [Unit] для определения службы, которая должна быть запущена до запуска вашей службы. Например, если вы используете NetworkManager, вы можете сделать так, чтобы ваша служба запускалась после запуска NetworkManager.

[Unit]
Description=test service
After=NetworkManager.service
9
27.01.2020, 19:29
[Unit]
After=systemd-networkd.service

у меня работает.

0
27.01.2020, 19:29

Теги

Похожие вопросы