Risvegliare il PC da standby o ibernazione, con Linux

Tempo fa creai un software per risvegliare, automaticamente e ad una certa ora, un PC dallo stato di standby o da quello di ibernazione.

Il software era scritto in .NET e sfruttava una particolare API di Windows, ma recentemente ho dovuto fare la stessa cosa con Ubuntu. La soluzione è più semplice di quanto si possa pensare.

Esiste già un comando, rtcwake, che permette di fare quello che cerchiamo:

usage: rtcwake [options]
    -d | --device     select rtc device (rtc0|rtc1|...)
    -l | --local      RTC uses local timezone
    -m | --mode       standby|mem|... sleep mode
    -s | --seconds    seconds to sleep
    -t | --time       time to wake
    -u | --utc        RTC uses UTC
    -v | --verbose    verbose messages
    -V | --version    show version

Purtroppo, se utilizziamo l’opzione -t (–time) potrebbero verificarsi dei problemi relativi all’orario, che può risultare errato. Non sono riuscito a risolvere il problema, ma ho seguito una strada alternativa: ho creato uno script che converte il parametro dal formato “–time” al formato “–seconds”. Così non ci si può sbagliare.

Ecco un esempio di utilizzo all’interno di uno script bash:

#!/bin/sh
# Sospende e risveglia il sistema
# Utilizzo: sleepwake "2010-02-22 0.0.0"

# Ottiene i secondi tra cui il PC deve riaccendersi
now=`date +%s`
t=`date --date "$1" +%s`
sec=$(($t-$now))

sudo /bin/true

sleep 3 && echo "Sospensione del sistema..." && sudo pm-suspend &
echo "Impostazione timer..."
sudo rtcwake -u -s $sec -m on
if [ $? -eq 0 ]
then
	echo "Sistema risvegliato!"
	exit 0
else
	echo "Errore"
	exit 1
fi

Tramite l’opzione “-m on” specifichiamo che non vogliamo delegare a rtcwake il compito di sospendere il PC. Lo facciamo manualmente, per avere più libertà e sicurezza. Qui ho scelto di usare “pm-suspend”, ma volendo potevamo anche ibernarlo.

Questo è tutto (ok, non lo è, ma non ho voglia di scrivere altro). Per approfondimenti, c’è sempre il manuale.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *