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.