You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控Linux伪文件系统变更 自动检测/sys/block目录文件增删

/sys类伪文件系统的变更监控实现方案

dnotify、inotify 监控不了sysfs、procfs这类伪文件系统的内容变更是内核设计上的既定行为:这类文件系统是内核运行时动态生成的对象映射,根本没实现fsnotify框架要求的inode事件回调钩子,你给这类路径加inotify监听接口不会报错,但永远收不到任何事件,不是代码写得有问题。

不用死磕定时扫描,有几个更智能、低开销的事件驱动方案可以选:

  • 首选方案:监听内核kobject uevent
    这是和sysfs设计逻辑完全匹配的原生方案,零轮询开销,实时性是毫秒级。sysfs里的每个目录、文件本质都是内核kobject对象的用户态导出,只要/sys/block这类路径下有新增、删除条目的动作,对应块设备注册/注销的时候,内核就会通过NETLINK_KOBJECT_UEVENT类型的netlink套接字主动广播事件,事件里自带操作类型(add/remove/change)、对应的sysfs完整路径、设备属性等信息,根本不需要你遍历目录找差异。
    不用自己手搓netlink报文解析逻辑,直接用libudev的封装接口就行:给监控句柄加上你关心的子系统过滤(比如监控块设备就过滤block子系统),等着读事件回调就可以,事件不会丢,也没有扫描带来的资源浪费。
  • 轻量触发场景:直接配置udev规则
    如果你不需要在独立业务程序里处理变更,只是要在/sys/block下条目增删时跑个自定义脚本,那连监听代码都不用写,直接加udev规则就行:匹配块设备的add/remove动作,绑定你要执行的脚本路径,事件分发全由系统的udev服务搞定。
  • 受限环境下的优化轮询方案
    如果你的运行环境特别精简,连udev、netlink相关的依赖都用不了,也不用做高频全量扫描:每次读目标目录的目录项列表后算一次列表哈希,只有哈希和上一次记录不一致的时候,再做具体的条目差异比对,就算把扫描间隔设成1秒,CPU占用也几乎可以忽略,比无脑全量扫效率高得多。

避坑提醒:别在sysfs、procfs上浪费时间试fanotify,这类伪文件系统同样没实现fanotify需要的底层回调,和inotify一样收不到任何事件。

内容的提问来源于stack exchange,提问作者Sysio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:31:13