Cron Jop erstellen damit der Laptop sich bei niedrigen Akkustand selbst herunterfährt unter FreeBSD?

Linuxfreakgraz

Lt. Commander
Registriert
Juli 2018
Beiträge
1.431
Unter einer Desktop Umgebung wie KDE Plasma fährt der Laptop bei so zirka 2% selbst herunter aber ich nutze einen Windowmanager, da passiert das nicht der Laptop läuft bis der Akku tiefenentladen ist und das Uefi abschaltet.

Ich nutze einen Dell Latitude 7280, ich habe im Uefi Setup nachgesehen in den Einstellungen gibt es keine Möglichkeit das man ein automatisches herunterfahren einstellen kann, es gibt Möglichkeiten den Laptop automatisch ab einer gewissen Akkuladung automatisch zu starten und automatische Startzeiten aber eben kein Herunterfahren.

Erstes Hinderniss ACPI ist noch nicht aktiv.
Code:
acpi_asus.ko
acpi_asus_wmi.ko
acpi_dock.ko
acpi_fujitsu.ko
acpi_hp.ko
acpi_ibm.ko
acpi_panasonic.ko
acpi_sony.ko
acpi_toshiba.ko
acpi_video.ko
acpi_wmi.ko
sdhci_acpi.ko
uacpi.ko
https://docs.freebsd.org/en/books/handbook/config/#acpi-overview
Was soll ich nehmen ich hab einen Dell, acpi_toshiba und andere werden wahrscheinlich nicht passen?

Zweitens ich habe noch nie einen Cron Jop erstellt, was muss da drin stehen das sich das System bei 2% Akkuladung selbst ausschaltet?
 
Ein Cron Job startet einen Job zu einer gewissen Zeit oder in einem Intervall, was du möchtest ist eigentlich ehr ein Systemd like verhalten das auf ein Event reagiert wird... Am einfachsten ist es einen job im Intervall z.B. 30s zu starten der prüft ob die Bedingung erfüllt ist und wenn ja das system herunterfährt.
 
  • Gefällt mir
Reaktionen: Asghan
kartoffelpü schrieb:
Zwar schon alt, aber funktioniert evtl. immer noch
Als ergänzende Anmerkung:
Ich würde nicht hw.acpi.battery.life abfragen, sondern hw.acpi.battery.time. Das liefert die (voraussichtlichen) Restminuten statt den Ladestand in %. Vor allem aber liefert es -1 , wenn keine Entladung stattfindet (siehe dazu auch acpi_battery).
Damit spart man sich viel Gehampel mit tracken des Battery-Status und abfragen der "acline" etc.
(außerdem ist Mail vielleicht eher unschön; man möchte lieber eine Desktop-Meldung via notify-send aus dem Package libnotify)

Somit kann man das Skript vereinfachen:
Bash:
#!/bin/sh

# Warnschwelle setzen (in Minuten)
warnmin=30
# Zwangs-Shutdown-Schwelle (in Minuten)
critmin=15

while true
do
  # Restminuten abfragen
  acpimin=$(sysctl -n hw.acpi.battery.time)

  # Wenn die Restminuten unter der Warnschwelle liegen, eine Warnung ausgeben
  if [ $acpimin -ne -1 ] && [ $acpimin -le $warnmin ]; then
    /usr/local/bin/notify-send -t 5000 -w "Akkustand niedrig: $acpimin Minuten!"
  fi
 
  # Wenn die Restminuten unter der Zwangs-Shutdown-Schwelle liegt, System ausschalten
  if [ $acpimin -ne -1 ] && [ $acpimin -le $critmin ]; then
    sudo poweroff
  fi

  # warten, bis der Akku-Stand wieder abgefragt werden soll (in Sekunden)
  sleep 60
done
(poweroff geht nur als root; man muss also ein entsprechenden sudo oder doas Eintrag anlegen, der ein passwortloses shutdown ermöglicht)

AlphaKaninchen schrieb:
Ein Cron Job startet einen Job zu einer gewissen Zeit oder in einem Intervall
Das ist zwar korrekt. Man kann das für eine periodische Abfrage dennoch nutzen.

Allerdings funktioniert dann notify-send nicht mehr. Man kann aber Dinge mit echo ausgeben, was dann in der CRONJob-Mail auftaucht. Dann erspart man sich die Endlosschleife:
Bash:
#!/bin/sh

# Warnschwelle setzen (in Minuten)
warnmin=30
# Zwangs-Shutdown-Schwelle (in Minuten)
critmin=15

# Restminuten abfragen
acpimin=$(sysctl -n hw.acpi.battery.time)

# Wenn die Restminuten unter der Warnschwelle liegen, eine Warnung ausgeben
if [ $acpimin -ne -1 ] && [ $acpimin -le $warnmin ]; then
  echo "Akkustand niedrig: $acpimin Minuten!"
fi

# Wenn die Restminuten unter der Zwangs-Shutdown-Schwelle liegt, System ausschalten
if [ $acpimin -ne -1 ] && [ $acpimin -le $critmin ]; then
  sudo poweroff
fi

Das trägt man dann nur noch als CRON-Job ein a-la:
Code:
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute  hour  mday  month  wday  command
*/5  *  *  *  *  sh /path/to/battery_warn.sh
# führt das Skript alle 5 Minuten aus
User-specific CRON-Jobs kann man mit crontab -e editieren. Wenn man dafür ein Editor seiner Wahl haben will (sonst landet man gerne im vi, wenn man es nicht anders konfiguriert hat), muss man die Variable EDITOR entsprechend setzen:
env EDITOR=ee crontab -e

All das steht und fällt aber damit, ob die entsprechenden sysctls da sind.
Da würde ich als erstes nach gucken mit sysctl hw.acpi.battery
Ansonsten müsste man mal nachschauen, wie KDE/Plasma das macht. Denn da funktioniert es ja anscheinend.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Linuxfreakgraz, Xero261286 und AlphaKaninchen
Nachdem ich auf einem Blog gelesen habe man soll acpi_video nehmen bei einem Dell, habe ich mit echo 'acpi_video_load="YES"' >> /boot/loader.conf acpi aktiviert.

kldstat sagt jetzt 4 1 0xffffffff8270f000 9438 acpi_video.ko
Danach hab ich folgendes Skript aus dem Internet koppiert.
Code:
#!/bin/sh
# Purpose: Shell script to shutdown FreeBSD laptop when running out of battery power at a certain percent
# Modified from: https://forums.freebsd.org/threads/automatic-shutdown-on-a-specific-battery-percent.14074/post-82134
#  + Added pushover ios/android support by nixCraft
#  + Must be run as root to shutdown the laptop
# --------------------------------------------------
 
# Who to warn
email="user@somehere-tld-com"
# Battery level critical %
critlevel=10
# Seconds to recheck and eventually act when battery is low
sleeps=60
# Seconds to pause between script runs
loop=180
 
while true
do
 
# battery %
battery1=$( /sbin/sysctl -n hw.acpi.battery.life )
# AC plugged in?
acpower1=$( /sbin/sysctl -n hw.acpi.acline )
 
if [ ${battery1} -le ${critlevel} ] && [ ${acpower1} = "0" ]
 then
  /bin/sleep ${sleeps}
 
  battery2=$( /sbin/sysctl -n hw.acpi.battery.life  )
  acpower2=$( /sbin/sysctl -n hw.acpi.acline )
 
   if [ ${battery2} -lt ${battery1} ] && [ ${acpower2} = "0" ]
    then
     echo "Insert power plug or kill PID $$ to prevent automatic shutdown. -- $(hostname)" | /usr/bin/mail -s "Battery ${battery2} % - Will shutdown in ${sleeps} seconds" "${email}"
     # push notification to my iOS device
     # get API keys
     # See https://www.cyberciti.biz/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/
     . /root/bin/push-to-mobile
     # send it
     push_to_mobile "$0" "Insert power plug or kill PID $$ to prevent automatic shutdown. -- $(hostname)"
 
     /bin/sleep ${sleeps}
 
      acpower3=$( /sbin/sysctl -n hw.acpi.acline )
 
      if [ ${acpower3} = "0" ]
       then /sbin/shutdown -p now
      fi
   fi
fi
 
/bin/sleep ${loop}
 
done

chmod a+x /root/powerdown-when-battry-low.sh

Und mit env EDITOR=ee crontab -e hab ich diesen cron jop erstellt.
Code:
# Shutdown FreeBSD server when running out of laptop battery
@reboot         /usr/sbin/daemon /root/powerdown-when-battry-low.sh

Ich bin neugierig ob das funktioniert.
Erstmal danke für die Hilfe.
 
Linuxfreakgraz schrieb:
Ich bin neugierig ob das funktioniert.
Endlosschleifen in CRONJobs ... gehen ..aber sind nicht sehr schön.

Und wie gesagt:
Wenn sysctl hw.acpi.battery nix ergibt, dann macht das alles ohnehin kein Sinn.

Außerdem würde ich das Skript erst mal so testen, um mögliche Fehler auszuschließen. Man kann zum testen critlevel auch einfach hoch setzen.

Linuxfreakgraz schrieb:
acpi_video nehmen
acpi_video kümmert sich, wie der Name schon andeutet, um Video (also Helligkeit usw.)
Also nicht, das man das nicht haben wollen würde. Aber es hilft nicht für den Batteriestatus.

Linuxfreakgraz schrieb:
habe ich mit echo 'acpi_video_load="YES"' >> /boot/loader.conf acpi aktiviert.
Ich würde den nicht in der /boot/loader.conf eintragen, sondern eher in der /etc/rc.conf:
sysrc kld_list+=acpi_video
 
  • Gefällt mir
Reaktionen: Linuxfreakgraz
@andy_m4
Code:
patrick@freebsd:~ $ sysctl hw.acpi.battery
hw.acpi.battery.info_expire: 5
hw.acpi.battery.units: 1
hw.acpi.battery.state: 1
hw.acpi.battery.rate: 6612
hw.acpi.battery.time: 148
hw.acpi.battery.life: 45
patrick@freebsd:~ $
Was die einzelnen Zahlen sagen sollen weis ich nicht. Aber es hätte mich gewundert da batterycat mir alles anzeigt was für mich relevant ist.
 

Anhänge

  • Bildschirmfoto_2024-07-29_14-08-10.png
    Bildschirmfoto_2024-07-29_14-08-10.png
    18,8 KB · Aufrufe: 52
Linuxfreakgraz schrieb:
Was die einzelnen Zahlen sagen sollen weis ich nicht.
Das steht unter acpi_battery(4). Hatte ich ja extra verlinkt. Hin und wieder lohnt sich auch, meine Links zu lesen. :-)

Linuxfreakgraz schrieb:
da batterycat mir alles anzeigt was für mich relevant ist.
Der geht sicher über das ACPI-Interface.
Darüber kann man auch rein gucken mit acpiconf. Zum Beispiel:
acpiconf -i 0
 
Stimmt hast schon in #8 gepostet hab ich aber übersehen.
Code:
patrick@freebsd:~ $ acpiconf -i 0
Design capacity:    7895 mAh
Last full capacity:    4759 mAh
Technology:        secondary (rechargeable)
Design voltage:        7600 mV
Capacity (warn):    789 mAh
Capacity (low):        239 mAh
Low/warn granularity:    78 mAh
Warn/full granularity:    78 mAh
Model number:        DELL V494084
Serial number:        34603
Type:            LION
OEM info:        Samsung SDI
State:            discharging
Remaining capacity:    35%
Remaining time:        1:52
Present rate:        895 mA (6692 mW)
Present voltage:    7478 mV
patrick@freebsd:~ $
 
Zurück
Oben