.png)
Me encanta abusar de la batería de mi computadora portátil al usarla durante bastante tiempo (hasta 25 minutos) incluso después de que el medidor de batería llega al 0%.
Sin embargo, a veces me olvido de eso o simplemente estoy lejos. Esto provoca un apagado completo, lo que tiene el potencial de dañar el sistema de archivos.
¿Cuál es la mejor manera de decirle a la computadora que hiberne automáticamente 15 minutos después de que la batería informa que está vacía? Mi idea es escribir un script Ruby o Bash que sondee periódicamente el /proc/
subsistema apropiado, pero me pregunto si hay algo incorporado.
Respuesta1
No te daré un sermón sobre tu batería ya que tú mismo usaste la palabra "abuso" :).
Una forma de hacerlo sería algo como esto:
#!/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
Podrías agregarlo para que /etc/crontab
lo ejecute root.
Respuesta2
Para cualquiera que quiera una funcionalidad similar, aquí hay un script Ruby.
Admite múltiples suspensiones seguidas (agotamiento, suspensión, carga, agotamiento, suspensión, ...) y es lo más robusto posible.
Ahora también es compatible libnotify
, por lo que recibes una notificación cada minuto.
#!/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
}
}