Hi,
Allerdings habe ich nun gemerkt, dass das acpi event
1 event=battery.*
2 action=/etc/acpi/warn_battery.sh %e
nur eintritt wenn ich das Ladegerät abziehe und eben nicht wenn der Ladestand niedrig ist.
Das ACPI-Event tritt ein, wenn
irgendwas mit dem Akku passiert, u.a. sollte bei sehr niedrigem Ladezustand eines ausgelöst werden. Du musst in warn_battery.sh dann also den Ladezustand prüfen (verbleibende %, "entlädt", kein Ultrabay-Akku vorhanden, der übernehmen könnte, Aktion nicht bereits ausgeführt/uptime, ...) und darauf entsprechend reagieren. Der Grenzwert für das Event scheint nicht konfigurierbar zu sein.
Frage ist nun wie ich es am besten realisiere, ein Skript auszuführen wenn eine Ladeschwelle unterschritten wird ohne ständig den Ladestand zu pollen. Also irgend eine event basierte Lösung.
Gibt es so etwas?
Abgesehen von laptop-mode-tools (nutzt definitiv das ACPI-Event) und den Power-Managern der großen DEs (braucht laufende X session(?), bspw. xfce4-power-manager) kenne ich da nichts. Wobei da nur Suspend/Hibernate/... möglich sind und der Grenzwert fest vorgegeben ist (ggf. wird hier auch nur das ACPI-Event abgefangen). Wie es (mittlerweile) bei GNOME/KDE aussieht, weiß ich nicht.
Folgende Möglichkeiten bieten sich
meinen Erkentnissen nach an/nicht an:
- acpi(d), siehe oben (lässt sich mit "acpi_listen" prüfen) (-)
- udev-Events/Regeln sind hier in etwa mit acpi(d) vergleichbar (-> "udevadm monitor --udev --kernel") (-)
- UPower (+)
- löst spätestens alle 30 Sekunden ein D-Bus-Event aus (-> "upower --monitor-detail")
- schwache Dokumentation (nur in-Code) -- oder gut versteckt (-)
- Daemon nötig, um die Ereignisse zu erhalten (fertige Lösungen hierzu sind mir nicht bekannt, Ideen gibt es u.a. hier, in C)
- der upowerd-Daemon muss ebenfalls laufen
- braucht udev, dbus
- die Akkuinformation (%, Anzahl der Akkus, ...) sind einfach (hardware-unabhängig) zu erhalten (+, in deinem Fall aber nicht so wichtig)
- Umsetzung als Skript möglich, wäre mir aber zu ineffizient und fehleranfällig (Textausgabe muss ausgewertet werden):
Code:
#!/bin/[b]bash[/b] -u
readonly UPOWER=/usr/bin/upower
while read -r event; do
echo "event = '${event}'" ## dbg
while read -r dump_data; do
# auswerten
true
done < <(${UPOWER} --dump)
done < <(${UPOWER} --monitor)
- Polling-basierte Lösung
- auch als Skript umsetzbar (oder Cronjob + Skript)
- (naive) Lösung ist mehr oder weniger offensichtlich und kurz (+)
Code:
#!/bin/sh -u
## kein echtes Skript!
POLL_INTERVAL=30
while sleep ${POLL_INTERVAL:?}; do
if <bat is low and discharging> and <CONDITIONS>; then ## and <not on AC>?
<ACTION>
fi
done
- die Akkuinformation muss man selbst ermitteln (Fehlerquelle/recht schnell hardware-spezifisch) (-)
Für die Problemstellung "Führe Skript S1 aus, falls Akkzustand in Bereich B1_low..B1_high, S2, falls B2 usf." hätte ich ggf. was halbfertiges, auf UPower aufbauend. Halbfertig heißt wenig getestet, Anforderungen werden grob erfüllt, Name des Programms nicht final

Kann ich bei Interesse <irgendwo> (Anmerkung: Link folgt - irgendwann) zur Verfügung stellen, ein paar Konsolenkenntnisse (cd,git-clone,make) und etwas Lesen sind allerdings erforderlich.
vg,
dywi