Aktionen beim Wechsel auf Batteriebetrieb ausführen

Mo, 20. März 2023, Lioh Möller

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.

Quelle: https://bbs.archlinux.org/viewtopic.php?id=207186

Tags

powermanagement, udev, systemd