Как я могу запустить службу systemd после установления сетевого соединения?
Некоторое время назад я настроил службу systemd для запуска после подключения сети в соответствии с документацией . Это файл модуля:
[Unit]
Description=Refresh Pacman mirrorlist with Reflector.
Documentation=https://wiki.archlinux.org/index.php/Reflector
Wants=network-online.target
After=network-online.target nss-lookup.target
[Service]
Type=oneshot
ExecStart=/usr/bin/reflector @/etc/xdg/reflector/reflector.conf
CacheDirectory=reflector
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
Environment=XDG_CACHE_HOME=/var/cache/reflector
LockPersonality=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true
PrivateDevices=true
PrivateTmp=true
PrivateUsers=true
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelTunables=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectSystem=strict
ReadOnlyPaths=/etc/xdg/reflector/reflector.conf
ReadWritePaths=/etc/pacman.d/mirrorlist
RemoveIPC=true
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
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
SystemCallArchitectures=native
SystemCallFilter=@system-service
SystemCallFilter=~@resources @privileged
UMask=177
[Install]
WantedBy=multi-user.target
Согласно документации , служба уже должна быть правильно настроена, чтобы дождаться установления сетевого подключения (т. е.: я вошел в систему, NetworkManager подключился к Wi-Fi, и системе был присвоен IP-адрес).
представляет собой цель, которая активно ожидает, пока сеть не будет «активна», где определение «активности» определяется программным обеспечением управления сетью. Обычно он указывает какой-либо настроенный маршрутизируемый IP-адрес. Его основная цель — активно откладывать активацию служб до тех пор, пока сеть не будет настроена.
Я также убедился, что это включено.
$ systemctl is-enabled NetworkManager-wait-online.service systemd-networkd-wait-online.service
enabled
disabled
Вместо того, чтобы служба ждала запуска до тех пор, пока не будет установлено подключение к Интернету, я вижу ошибку на системной консоли почти сразу после появления приглашения для входа в систему.
Jul 05 07:40:02 gadget systemd[1]: Starting Refresh Pacman mirrorlist with Reflector....
Jul 05 07:40:03 gadget reflector[564]: error: failed to retrieve mirrorstatus data: URLError: <urlopen error [Errno -3] Temporary failure in name resolution>
Jul 05 07:40:03 gadget systemd[1]: reflector.service: Main process exited, code=exited, status=1/FAILURE
Jul 05 07:40:03 gadget systemd[1]: reflector.service: Failed with result 'exit-code'.
Jul 05 07:40:03 gadget systemd[1]: Failed to start Refresh Pacman mirrorlist with Reflector..
Поскольку он должен дождаться подключения сети и доступности DNS, я также проверил статус ,network-online.target
иnss-lookup.target
:
$ systemctl status NetworkManager-wait-online.service
● NetworkManager-wait-online.service - Network Manager Wait Online
Loaded: loaded (/usr/lib/systemd/system/NetworkManager-wait-online.service; enabled; vendor preset: disabled)
Active: active (exited) since Mon 2021-07-05 07:40:02 CEST; 44min ago
Docs: man:nm-online(1)
Main PID: 544 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 38321)
Memory: 0B
CPU: 0
CGroup: /system.slice/NetworkManager-wait-online.service
Jul 05 07:40:02 gadget systemd[1]: Starting Network Manager Wait Online...
Jul 05 07:40:02 gadget systemd[1]: Finished Network Manager Wait Online.
$ systemctl status network-online.target
● network-online.target - Network is Online
Loaded: loaded (/usr/lib/systemd/system/network-online.target; static)
Active: active since Mon 2021-07-05 07:40:02 CEST; 1h 5min ago
Docs: man:systemd.special(7)
https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 05 07:40:02 gadget systemd[1]: Reached target Network is Online.
$ systemctl status nss-lookup.target
○ nss-lookup.target - Host and Network Name Lookups
Loaded: loaded (/usr/lib/systemd/system/nss-lookup.target; static)
Active: inactive (dead)
Docs: man:systemd.special(7)
Мне кажется странным, чтоNetworkManager-wait-online.service
отчеты заканчиваются сразу после запуска. Есть ли что-то еще, что мне нужно настроить? Это ошибка в NetworkManager и/или nm-online?
Я искал похожие темы и нашел эти вопросы, но они не отвечают на мою проблему:
2 ответа
Значение слова «сеть онлайн» расплывчато, а network-online.target соответствует только самому базовому из возможных значений слова «сеть онлайн». См. https://freedesktop.org/wiki/Software/systemd/NetworkTarget для более полного объяснения.
Вам необходимо точно определить, что вам нужно для подключения к сети и какие службы должны работать для правильной работы вашей службы, и либо добавить их в качестве зависимостей, либо добавить тесты в последовательность запуска вашей службы, чтобы дождаться их.
Как указано на странице выше в конце, лучше всего было бы настроить вашу службу так, чтобы она могла обрабатывать динамические изменения в конфигурации сети, а не давать сбой, если она не совсем соответствует ожиданиям.
Проверьте systemd-resolvd.service на наличиеBefore=nss-lookup.target
зависимость. Он должен работать.
Затем проверьте еще раз, чтобы убедиться:
systemctl is-enabled NetworkManager-wait-online.service systemd-networkd-wait-online.service