giovedì 8 agosto 2013

Accensione automatica del pc con RTC Alarm

RTC Alarm è un'interessante caratteristica, presente in tutte le motherboard oramai da parecchi anni, che permette di programmare in maniera automatica l'accensione dei nostri pc in date e orari da noi prestabiliti.
Mentre in passato era in genere possibile accedere direttamente alle impostazioni di RTC Alarm tramite la sezione Power Management del BIOS, i produttori di schede madri al giorno d'oggi sembra che preferiscono tenerle 'nascoste', nonostante continuino comunque a supportarle.

In Linux è possibile programmare facilmente il 'wakeup' automatico delle nostre macchine, bypassando l'accesso al BIOS, tramite l'utility rtcwake.
Gli utilizzatori di Fedora non avranno bisogno di installare questo programma, perché è sicuramente già presente facendo parte del pacchetto util-linux, assolutamente essenziale in un sistema GNU/Linux
I parametri da passare al programma sono fondamentalmente due: il tipo di standby e data e ora in cui il pc dovrà ripartire.
Le modalità di standby impostabili sono le seguenti: standby, memfreeze, disk, off, no, on, disable e  show. 
Quella che preferisco e che in genere utilizzo è no. Con questa opzione semplicemente impostiamo l'orario del wakeup senza che venga attivata nessuna modalità di sospensione, il che significa che una volta dato il comando possiamo continuare a lavorare. Quando decideremo di chiudere la nostra sessione di lavoro lo faremo selezionando Iberna dal menu di logout del nostro display manager (gdm, kdm, lxdm ecc.) e non Spegni. Questo servirà a rendere effettiva la nostra accensione programmata.
Se non stiamo lavorando in X ma in un tty, dovremo allora spegnere il nostro pc con pm-hibernate oppure systemctl hibernate (da eseguire come utente root).
Per dettagli sulle altre modalità di standby vi invito a consultare direttamente il manuale di rtcwake (man rtcwake)
Il secondo parametro, come dicevamo, è l'effettivo orario di wakeup: il programma richiede che tale parametro sia formattato secondo lo Unix Time (o Posix Time), un sistema di rappresentazione del tempo largamente utilizzando nei sistemi Unix e Unix-like (come Linux) che si basa sul numero di secondi trascorsi a partire dalle ore 00:00:00 del 01 gennaio 1970 (la cosiddetta Unix Epoch).
La conversione del tempo in Unix time è estremamente semplice grazie al comando date e la sua opzione %s. Ad esempio, per visualizzare l'ora attuale del sistema in Unix time basta dare:
 $ date +%s
1375909919
Possiamo verifichiamo a cosa effettivamente corrisponde  "1375909919" dando:
$ date -d @1375909919
mer  7 ago 2013, 23.11.59, CEST
Ipotizziamo di voler programmare l'accensione della nostra macchina alle ore 8.00 di domani mattina; per calcolare il corrispondente Unix Time daremo:
$ date +%s -d 'tomorrow 08:00'
1375941600
Attiviamo quindi RTC alarm con:
# rtcwake -a -m no -t 1375941600
rtcwake: wakeup using /dev/rtc0 at Thu Aug  8 06:00:01 2013
Il fatto che il comando ci restituisca come orario "06:00" anziché "08:00" non è un errore come potrebbe sembrare. È semplicemente la rappresentazione secondo il Tempo Coordinato Universale o UTC ovvero il fuso orario di riferimento da cui si calcolano tutti gli altri fusi orari del mondo (a sua volta derivato dal GMT ( Greenwich Mean Time o Greenwich Meridian Time) e che systemd utilizza di default per l'orologio hardware del pc.
Per verificare la correttezza dell'orario di wakeup in base alle impostazioni locali della nostra macchina diamo:
# rtcwake -m show -l
alarm: on  Thu Aug  8 08:00:01 2013
che ci conferma che tutto è stato settato correttamente. Ricordiamoci di spegnere il nostro pc ibernandolo, per rendere attivo RTC Alarm.
A questo punto, compreso il meccanismo, diventa semplice scrivere degli script personalizzati in base alle nostre necessità: eccone ad esempio uno (da eseguire come root ogni giorno prima dello spegnimento) che programma il wakeup ogni mattina alle ore 07:45 del giorno successivo (esclusivamente dal lunedì al venerdì), in modo che al nostro arrivo in ufficio il pc sia acceso e pronto all'uso:
#!/bin/sh
if [[ $(date +%u) -gt 4 ]]; then
        DATE=$(date +%s -d 'next Monday 07:45')
else
        DATE=$(date +%s -d 'tomorrow 07:45')
fi
/sbin/rtcwake -a -m no -t $DATE
Qui potete trovare un dettagliato articolo sulla sintassi del comando date, in particolare per come indicare con facilità date future.  
  

Nessun commento:

Posta un commento