Benutzerdefinierte Regel für niedrigen Batteriestand (Ruhezustand)

Benutzerdefinierte Regel für niedrigen Batteriestand (Ruhezustand)

Ich liebe es, den Akku meines Laptops übermäßig zu beanspruchen, indem ich ihn längere Zeit (bis zu 25 Minuten) benutze, selbst wenn die Akkuanzeige 0 % anzeigt.

Manchmal vergesse ich das jedoch oder bin einfach nicht da. Dies führt zu einem harten Herunterfahren, was das Dateisystem beschädigen kann.

Wie kann man dem Computer am besten sagen, dass er 15 Minuten, nachdem die Batterie eine leere Batterie meldet, automatisch in den Ruhezustand wechseln soll? Meine Idee ist, ein Ruby- oder Bash-Skript zu schreiben, das das entsprechende Subsystem regelmäßig abfragt /proc/, aber ich frage mich, ob es dafür etwas Integriertes gibt.

Antwort1

Ich werde Ihnen keinen Vortrag über Ihre Batterie halten, da Sie selbst das Wort „Missbrauch“ verwendet haben :).

Eine Möglichkeit hierfür wäre etwa die folgende:

#!/usr/bin/env bash

while [ $(acpi | awk '{print $NF}' | sed 's/%//') -gt 0 ]; do
    ## Wait for a minute
    sleep 60s
done

## The loop above will exit when the battery level hits 0.
## When that happens, issue the shitdown command to be run in 15 minutes
shutdown -h +15

Sie können es hinzufügen, damit /etc/crontabes von Root ausgeführt werden kann.

Antwort2

Für alle, die eine ähnliche Funktionalität wünschen, hier ist ein Ruby-Skript.

Es unterstützt mehrere Suspends hintereinander (Erschöpfung, Suspend, Laden, Erschöpfung, Suspend, …) und ist so robust wie möglich.

Jetzt unterstützt es auch libnotify, sodass Sie jede Minute eine Benachrichtigung erhalten.

#!/usr/bin/ruby
    require 'eventmachine'
    require 'libnotify'

    period = 40 # poll evey N seconds
    limit = (ARGV[0] || 20).to_i # allow usage N minutes after depletion

    def get(prop)
        File.read("/sys/class/power_supply/BAT0/#{prop}").chomp
    end

    def capacity
        get(:charge_now).to_i
    end

    def onBattery?
        get(:status) != 'Charging'
    end

    def action!
        `sync`
        `systemctl suspend`
    end

    puts 'Starting battery abuse agent.'

    EM.run {
        ticks = 0
        EM.add_periodic_timer(period) {
            if capacity == 0 && onBattery?
                ticks += 1
                if ticks % 5 == 0
                    Libnotify.show summary: 'Baterry being abused',
                        body: "for #{period*ticks} seconds.", timeout: 7.5
                end
            else
                ticks = [ticks-1, 0].max
            end
            if ticks*period > limit*60
                action!
            end
        }
    }

verwandte Informationen