Anhand von udev Regeln und systemd lassen sich Aktionen auf einem Laptop ausführen, sobald ein Wechsel in den Batteriebetrieb stattfindet. Dies kann beispielsweise genutzt werden, um den CPUFreq Governor auf den powersave Modus umzustellen, oder um beliebige Scripte auszuführen.
Im folgenden Beispiel wird der CPUFreq Governor mithilfe von cpupower, welches unter Fedora im Paket kernel-tools enthalten ist, automatisch gesetzt.
Voraussetzung dazu ist die Erstellung eines entsprechenden udev Regelwerks
/etc/udev/rules.d/powersave.rules
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/local/bin/power.sh AC"
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/local/bin/power.sh BAT"
Im obigen Beispiel wird das folgende Script mit unterschiedlichen Parametern ausgeführt.
/usr/local/bin/power.sh
#!/usr/bin/bash
STATE=""
BAT="BAT1"
if [[ "$1" == "BAT" || "$1" == "AC" ]]; then
STATE="$1"
fi
if [[ $STATE == "" ]]; then
if [[ $(upower -i /org/freedesktop/UPower/devices/battery_$BAT | grep state | grep discharging) == "" ]]; then
STATE="AC"
else STATE="BAT"
fi
fi
echo $STATE
if [[ $STATE == "BAT" ]]; then
echo "Discharging, set governor to powersave"
cpupower frequency-set -g ondemand
elif [[ $STATE == "AC" ]]; then
echo "AC plugged in, set governor to performance"
cpupower frequency-set -g performance
fi
Das Script muss nach der Erstellung als ausführbar markiert werden:
chmod +x /usr/local/bin/power.sh
Um den Status auch beim Systemstart zu ermitteln und entsprechende Aktionen auszuführen, können folgende systemd Servicedefinitionen erstellt werden:
/etc/systemd/system/powermanagement-resume.service
[Unit]
Description=Local system resume actions
After=suspend.target
[Service]
Type=simple
ExecStart=/usr/local/bin/power.sh
[Install]
WantedBy=suspend.target
/etc/systemd/system/powermanagement.service
[Unit]
Description=Sets the CPU governor on boot according to AC mode
Requires=multi-user.target
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/local/bin/power.sh
[Install]
WantedBy=multi-user.target
Nach der Erstellung können die systemd-Dienste aktiviert werden:
systemctl enable powermanagement.service
systemctl enable powermanagement-resume.service
Die Möglichkeiten dieser Vorgehensweise sind vielfältig. So lässt sich beispielsweise auch ein Syncthing Prozess im Akkubetrieb beenden oder mit verbundenem Netzteil wieder starten.