我试图通过监视/sys/class/net/eth0/carrier_up_count
系统文件的更改来在插入某些以太网电缆时重新启动 systemd 服务。
我尝试创建一个 systemd 路径服务:
[Path]
PathModified=/sys/class/net/eth0/carrier_up_count
Unit=restart-other-service.service
但是,虽然我可以看到carrier_up_count
插入电缆时确实发生了变化,但该路径服务永远不会被触发。
我认为发生这种情况是因为 systemd 路径服务实际上监视文件何时打开和关闭以进行写入,并且文件/sys/
始终打开(我可以看到文件的最后修改时间戳不会改变,即使文件的内容发生了变化) 。
我还尝试使用 systemd 套接字服务ListenSpecial=/sys/class/net/eth0/carrier_up_count
,但该服务失败:
Got unexpected poll event (0x9) on socket.
Failed with result 'resources'.
有没有办法让 systemd 监视 中文件的更改/sys/
?我想我可以创建一个定期读取目标文件的 cronjob,但感觉应该有更好的方法。
不,文件系统监控是一个内核功能,而systemd只是使用这个功能。
sysfs文件系统是内核对象到文件名的映射,不支持inotify。
监视接口启动/关闭事件的最佳方法是通过 netlink(该
ip mon
命令显示那里可用的事件),但 systemd 配置语言没有为此提供关键字。如果有问题的服务依赖于网络连接,则可以声明对此的依赖关系,但我不确定组件堆栈的拆卸语义是否定义良好,这是规范中的一个明显漏洞。