.png)
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/crontab
es 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
}
}