Я хочу знать, когда меняется заряд моей батареи, и не хочу просто запускать демон, который проверяет это каждые пять секунд.
Я пробовал запускать inotifywait -m /sys/class/power_supply/BAT1/capacity
, но он не регистрирует никаких изменений, хотя cat
-ing время от времени дает разные результаты! Фактически, он сообщает что-то только тогда, когда я использую cat
его или запускаю acpi
. Я также пробовал запускать inotifywait
другие файлы в каталоге BAT1 и обнаружил, что ни один из них не был замечен в измененном виде -, несмотря на то, что дает новые результаты с cat
.
Так почему же не inotifywait
сообщает об изменениях? И как я могу получать мгновенные обновления об изменениях уровня заряда батареи, если я не могу использовать inotify?
решение1
Как сказал @rudib в комментариях, все /sys
виртуально: содержимое каждого файла создается заново из соответствующей структуры данных ядра всякий раз, когда оно фактически считывается. Таким образом, нет никаких модификаций в смысле записи чего-либо в файл для его изменения.
То же самое касается /proc
.
Уведомления о состоянии батареи доступны какобщие сообщения Netlink, с именем семьи = acpi_event
и именем группы multicast acpi_mc_group
. К сожалению, я не знаю инструмента, который бы давал легкий доступ к сообщениям Netlink для скриптов оболочки, но, по-видимому,pyroute2
Инструмент также может декодировать сообщения NetLink, содержащие события ACPI, поэтому он может быть полезен в качестве примера кода Python.