首页 > 解决方案 > 为什么 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 的变化解决了我的问题,但问题仍然有效。

标签: linuxbashinotifybacklight

解决方案


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

推荐阅读