Ich möchte wissen, wann sich der Ladezustand meiner Batterie ändert, und ich möchte nicht einfach einen Daemon ausführen, der dies alle fünf Sekunden überprüft.
Ich habe versucht, auszuführen inotifywait -m /sys/class/power_supply/BAT1/capacity
, aber es werden keine Änderungen registriert, obwohl cat
die gelegentliche Eingabe von - zu anderen Ergebnissen führt! Tatsächlich meldet es nur etwas, wenn ich cat
darauf oder auf Ausführen von verwende acpi
. Ich habe auch versucht, auf anderen Dateien im BAT1-Verzeichnis auszuführen inotifywait
, und habe festgestellt, dass keine Änderungen an diesen Dateien sichtbar sind, obwohl neue Ergebnisse mit angezeigt werden cat
.
Warum werden also keine inotifywait
Änderungen gemeldet? Und wie kann ich sofortige Updates zu Änderungen des Batteriestands erhalten, wenn ich inotify nicht verwenden kann?
Antwort1
Wie @rudib in den Kommentaren sagte, ist alles /sys
virtuell: Der Inhalt jeder Datei wird beim tatsächlichen Lesen frisch aus der entsprechenden Kernel-Datenstruktur erstellt. Es gibt also keine Änderungen im Sinne von etwas, das in die Datei geschrieben wird, um sie zu ändern.
Das gleiche gilt für /proc
.
Batteriestatusbenachrichtigungen sind verfügbar alsgenerische Netlink-Nachrichten, mit family name = acpi_event
und multicast group name acpi_mc_group
. Leider kenne ich kein Tool, das Shell-Skripten einen einfachen Zugriff auf Netlink-Nachrichten ermöglicht, aber anscheinendpyroute2
Das Tool kann auch Netlink-Nachrichten dekodieren, die ACPI-Ereignisse enthalten, sodass es als Python-Codebeispiel nützlich sein könnte.