为什么 inotifywait 没有注意到 /sys/class/backlight/intel_backlight/brightness (Linux) 中的变化

Why doesn't inotifywait notice the change in /sys/class/backlight/intel_backlight/brightness (Linux)

我的笔记本电脑是 4K OLED 屏幕,所以它没有背光来改变屏幕的亮度。要控制亮度,您需要使用带有 --brightness 参数的 xrandr。我以前在 i3 window 管理器中成功完成了此操作,但现在我想在 Budgie 中进行类似的操作。

Budgie 将检测亮度击键并将 /sys/class/backlight/intel_backlight/brightness 文件内容更改为通常会更新背光设置的值。

我想监视这个文件的变化,当它发生变化时,只需用正确的值调用 xrandr...我发现你可以用 inotifywait 观察文件变化,但由于某种原因,它不起作用对我来说。

$ cat /sys/class/backlight/intel_backlight/brightness
21750
# Now pressing the brightness up key on the keyboard
$ cat /sys/class/backlight/intel_backlight/brightness
28000
$ inotifywait /sys/class/backlight/intel_backlight/brightness
Setting up watches.
Watches established.
# Now pressing the brightness up key on the keyboard....... nothing happens.
# Same when I add the -e close_write parameter.

有人知道为什么会这样吗?

我当然可以每秒检查一次文件的内容,但我不喜欢那种解决方案。

仅供参考:Arch Linux,最新

编辑:我刚刚注意到它确实注意到 /sys/class/backlight/acpi_video0/brightness 中的变化,这解决了我的问题,但问题仍然有效。

Inotify 在 VFS 级别(文件系统级别,可以这么说)工作。如果 file 被写入,inotify 将被通知。但是,由于 sysfs(和 procfs,以及所有其他虚拟文件系统)的内容可能动态和异步更新而不是通过文件系统,使用 inotify 可能不会产生预期的结果。

在您的情况下 - /sys/class/backlight/intel_backlight/brightness 的值可能会以其他方式更新,而不是通过文件系统,而 /sys/class/backlight/acpi_video0/brightness 确实通过文件系统更新。这取决于控制软件。这可能是您观察的原因。

郑重声明 - 我已经在我的笔记本电脑上对其进行了测试:背景为 inotifywatch /sys/class/backlight/intel_backlight/brightness 运行,我会在以下时间收到通知:

  • cat /sys/class/backlight/intel_backlight/brightness - close_nowrite.
  • echo 50000 | sudo tee /sys/class/backlight/intel_backlight/brightness - 改变亮度,我得到 close_write.
  • 通过键盘快捷键更改亮度 - 对于每个 increase/decrease 我得到 1 个 close_write 事件 (运行 GNOME Shell 3.36.4)