Regla personalizada de batería baja (hibernación)

Regla personalizada de batería baja (hibernación)

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/crontablo 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
        }
    }

información relacionada