首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在建立网络链接后运行系统服务?

如何在建立网络链接后运行系统服务?
EN

Server Fault用户
提问于 2021-07-05 06:47:42
回答 2查看 8.3K关注 0票数 4

不久前,我建立了一个systemd服务,以便在网络在线后运行根据文件。这是单元文件:

代码语言:javascript
复制
[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已经连接到WiFi,系统已经被分配了一个IP)。

network-online.target是一个主动等待直到网络“向上”的目标,其中"up“的定义由网络管理软件定义。通常它表示某种配置的、可路由的IP地址。其主要目的是在建立网络之前主动延迟服务的激活。

我还确保启用了NetworkManager-wait-online.service

代码语言:javascript
复制
$ systemctl is-enabled NetworkManager-wait-online.service systemd-networkd-wait-online.service
enabled
disabled

我几乎一看到登录提示,就会在系统控制台上看到一个错误,而不是等到建立了internet连接之后才开始服务。

代码语言:javascript
复制
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: 
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可用,我还检查了NetworkManager-wait-online.servicenetwork-online.targetnss-lookup.target的状态:

代码语言:javascript
复制
$ 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中的一个bug吗?

我寻找过类似的话题,并发现了这些问题,但它们没有回答我的问题:

EN

回答 2

Server Fault用户

发布于 2021-07-05 11:34:18

“网络在线”的含义是模糊的,网络在线,目标只是模糊了“网络在线”最基本的含义。有关更完整的解释,请参见https://freedesktop.org/wiki/Software/systemd/NetworkTarget

您需要精确地确定您需要在网络中启动哪些服务,以及哪些服务需要为您的服务正确工作,或者将它们作为依赖项添加,或者在服务启动序列中添加测试以等待它们。

正如上面的页面最后所述,最好是调整您的服务,使其能够处理网络配置的动态更改,而不是在没有完全按照预期的情况下失败。

票数 1
EN

Server Fault用户

发布于 2021-07-05 07:51:17

检查systemd-解析式服务中的Before=nss-lookup.target依赖项。应该管用的。

然后再检查一遍以确保:

代码语言:javascript
复制
systemctl is-enabled NetworkManager-wait-online.service systemd-networkd-wait-online.service
票数 -1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1068662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档