Рейтинг:3

Как я могу запустить службу systemd после установления сетевого соединения?

флаг us

Некоторое время назад я настроил службу systemd для запуска после подключения сети. согласно документации. Это файл модуля:

[Ед. изм]
Description=Обновить список зеркал Pacman с помощью Reflector.
Документация=https://wiki.archlinux.org/index.php/Reflector
Хочет=network-online.target
After=network-online.target nss-lookup.target

[Оказание услуг]
Тип = ваншот
ExecStart=/usr/bin/reflector @/etc/xdg/reflector/reflector.conf
CacheDirectory=отражатель
CapabilityBoundingSet=~CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_SYS_TIME CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SYS_NICE CAP_SYS_RESOURCE CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_BOOT CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_WAKE_ALARM
Среда=XDG_CACHE_HOME=/var/кэш/рефлектор
LockPersonality=true
MemoryDenyWriteExecute=true
Ноньюпривилегес=истина
Частные устройства = истина
PrivateTmp=истина
Приватусерс = истина
ProtectClock=истина
Протектконтролграупс=истина
ПротектХоме=истина
ProtectHostname=истина
Протекткернелтунаблес=истина
Протекткернеллогс=истина
Протекткернелмодулес = истина
ProtectSystem=строгий
ReadOnlyPaths=/etc/xdg/reflector/reflector.conf
ReadWritePaths=/etc/pacman.d/mirrorlist
УдалитьIPC=истина
RestrictAddressFamilies=~AF_AX25 AF_IPX AF_APPLETALK AF_X25 AF_DECnet AF_KEY AF_NETLINK AF_PACKET AF_RDS AF_PPPOX AF_LLC AF_IB AF_MPLS AF_CAN AF_TIPC AF_BLUETOOTH AF_ALG AF_VSOCK AF_KCM AF_UNIX AF_XDP
Рестриктнамеспейс=истина
Ограничение в реальном времени = истина
ОграничениеSUIDSGID=истина
SystemCallArchitectures=родной
SystemCallFilter=@системный-сервис
SystemCallFilter=~@resources @привилегированный
Маска = 177

[Установить]
WantedBy=многопользовательская.цель

Пер документация, служба уже должна быть правильно настроена, чтобы дождаться установления сетевого подключения (т. е. я вошел в систему, NetworkManager подключился к WiFi, и системе был назначен IP-адрес).

сеть-online.target - это цель, которая активно ожидает, пока сеть не будет «работающей», где определение «работающей» определяется программным обеспечением управления сетью. Обычно это указывает на настроенный маршрутизируемый IP-адрес. Его основная цель — активная задержка активации служб до тех пор, пока сеть не будет настроена.

Я также убедился, что NetworkManager-wait-online.service включен.

$ systemctl включен NetworkManager-wait-online.service systemd-networkd-wait-online.service
включено
Отключено

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

05 июля, 07:40:02 gadget systemd[1]: запуск обновления списка зеркал Pacman с помощью Reflector....
05 июля 07:40:03 гаджет-рефлектор[564]: ошибка: не удалось получить данные о статусе зеркала: URLError: <ошибка открытия URL [Errno -3] Временный сбой в разрешении имени>
05 июля, 07:40:03 гаджет systemd[1]: Reflector.service: основной процесс завершен, код = выход, статус = 1/FAILURE
05 июля, 07:40:03 гаджет systemd[1]: Reflector.service: Ошибка с результатом «код выхода».
05 июля, 07:40:03 гаджет systemd[1]: не удалось запустить обновление списка зеркал Pacman с помощью Reflector..

Поскольку он должен ждать подключения сети и доступности DNS, я также проверил статус NetworkManager-wait-online.service, сеть-online.target и nss-lookup.target:

$ systemctl статус NetworkManager-wait-online.service
â NetworkManager-wait-online.service — диспетчер сети ждет онлайн
     Загружено: загружено (/usr/lib/systemd/system/NetworkManager-wait-online.service; включено; предустановка поставщика: отключена)
     Активен: активен (закрыт) с понедельника 05.07.2021 07:40:02 CEST; 44 мин назад
       Документы: man:nm-online(1)
   Основной PID: 544 (код=выход, статус=0/УСПЕХ)
      Заданий: 0 (лимит: 38321)
     Память: 0B
        ЦП: 0
     CGroup: /system.slice/NetworkManager-wait-online.service

05 июля, 07:40:02 gadget systemd[1]: Запуск Network Manager Подождите онлайн...
05 июля, 07:40:02 gadget systemd[1]: Готово Network Manager Подождите онлайн.
$ systemctl статус network-online.target
â network-online.target — Сеть находится в сети
     Загружено: загружено (/usr/lib/systemd/system/network-online.target; статично)
     Активен: активен с понедельника 05.07.2021 07:40:02 CEST; 1ч 5мин назад
       Документы: man:systemd.special(7)
             https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

05 июля, 07:40:02 гаджет systemd[1]: достигнута целевая сеть в сети.
$ systemctl статус nss-lookup.target
○ nss-lookup.target — Поиск имени хоста и сети
     Загружено: загружено (/usr/lib/systemd/system/nss-lookup.target; статично)
     Активный: неактивный (мертвый)
       Документы: man:systemd.special(7)

Мне кажется странным, что NetworkManager-wait-online.service отчеты заканчиваются сразу после запуска. Есть ли что-то еще, что мне нужно настроить? Это ошибка в NetworkManager и/или nm-online?

Я искал похожие темы и нашел эти вопросы, но они не отвечают на мою проблему:

Michael Hampton avatar
флаг cz
Однако он уже поставляется со своими собственными модулями systemd! Почему бы просто не использовать это?
Рейтинг:1
флаг nc

Значение слова «сеть онлайн» расплывчато, а network-online.target соответствует только самому основному из возможных значений слова «сеть онлайн». Видеть https://freedesktop.org/wiki/Software/systemd/NetworkTarget для более полного объяснения.

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

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

Evy Bongers avatar
флаг us
Я уже связал эти документы и процитировал из них: «`network-online.target` — это цель, которая активно ждет, пока сеть не «включится», где определение «вверх» определяется программным обеспечением для управления сетью.Обычно это указывает на какой-то сконфигурированный, маршрутизируемый IP-адрес." Итак, если я правильно понимаю, проблема в том, что мое ожидание цели не совпадает с тем, как ее реализовали разработчики NetworkManager.
user10489 avatar
флаг nc
network-online.target может быть необходимым, но недостаточным. Может быть, вам нужно также проверить, разрешается ли конкретное имя хоста или что-то в этом роде. Кроме того, это должно быть одноразовым или может быть простым, чтобы не блокировать остальную часть запуска системы?
Рейтинг:-1
флаг in

Проверьте systemd-resolvd.service для До = nss-lookup.target зависимость. Он должен работать.

Затем проверьте еще раз, чтобы убедиться:

systemctl включен NetworkManager-wait-online.service systemd-networkd-wait-online.service
Evy Bongers avatar
флаг us
В `systemd-resolvd.service` перечислены: `Before=network.target nss-lookup.target shutdown.target`. Обновлен исходный вопрос, чтобы включить команду.
Evy Bongers avatar
флаг us
Если подумать, с чего бы это было связано? Я не использую `systemd-resolved.service`.
user10489 avatar
флаг nc
Если вы не используете systemd-resolved.service, какой преобразователь вы используете? Возможно, вам следует добавить это в свои зависимости.
Evy Bongers avatar
флаг us
Я использую NetworkManager для управления сетью.Вот почему я несколько раз упомянул `NetworkManager-wait-online.service`, в отличие от `systemd-networkd-wait-online.service`.

Ответить или комментировать

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