linux - 为什么 inotifywait 没有注意到 /sys/class/backlight/intel_backlight/brightness 的变化(Linux)
问题描述
我的笔记本电脑有一个 4K OLED 屏幕,所以它没有背光来改变屏幕的亮度。要控制亮度,您需要将 xrandr 与 --brightness 参数一起使用。我之前已经在 i3 窗口管理器中成功地做到了这一点,但我现在想在 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 级别(可以说是文件系统级别)工作。如果文件被写入,inotify 将收到通知。但是,由于 sysfs(和 procfs 以及所有其他虚拟文件系统)的内容可能不是通过 filesystem动态和异步更新的,因此使用 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
。- 通过键盘快捷键更改亮度 - 每次增加/减少我都会得到 1 个
close_write
事件(正在运行GNOME Shell 3.36.4
)