![systemd:启动依赖于套接字的服务不起作用](https://linux22.com/image/1405826/systemd%EF%BC%9A%E5%90%AF%E5%8A%A8%E4%BE%9D%E8%B5%96%E4%BA%8E%E5%A5%97%E6%8E%A5%E5%AD%97%E7%9A%84%E6%9C%8D%E5%8A%A1%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在使用 systemd 启动 WiFi 和电源监控服务脚本,该脚本扫描 SSID、启动网络和 SSH 隧道并执行一些其他任务。
令我惊讶的是,它在冷启动时并不总是有效(但在热启动时有效)。初始“ifconfig mlan0 up”失败。这似乎与依赖于套接字的竞争条件有关:
root@duovero:~# systemctl status wifipwrmon
....
Jan 01 00:00:08 duovero wifipwrmon.sh[415]: ifconfig: SIOCGIFFLAGS: No such ...e
Jan 01 00:00:17 duovero wifipwrmon.sh[415]: Searching for WiFi routers
这是一个有点牵强的例子,因为我可以重新发出 ifconfig。但我还有另一个依赖于 IPC 套接字的服务。除非我在启动之前设置较长的延迟,否则启动时会完全失败。
这是我对 wifipwrmon.service 的使用:
[Unit]
Description=WiFi power monitor service
[email protected]
[email protected]
[Service]
ExecStart=/home/root/i2c/monitor/wifipwrmon.sh
[Install]
WantedBy=multi-user.target
我承认我习惯使用 sysvinit,而对 systemd 还不熟悉,做这件事的时候时间不够。由于我想让它在很晚的时候启动,所以我依赖 getty 启动(这可能是新手会做的事情)。
有人能告诉我启动依赖套接字通信的服务需要什么依赖关系吗?我很惊讶它竟然失败了 - 我以为套接字如此重要,应该在内核中。
答案1
据我所知,该问题与套接字无关,但与设备初始化有关。
在 systemd 中,服务启动和设备初始化并行运行。您的情况是,在冷启动时,您的 wifi 设备需要更长时间才能初始化,并且您的服务在可用之前就启动了,导致 ifconfig 失败
你可以使用类似的东西:
[Unit]
BindTo=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-wlan0.device
在您的服务文件中,在无线设备出现后订购您的设备。