Despierta ubuntu a una hora determinada

Posted by in Linux

 

Hace poco he leí un comando que viene en la mayoría de las distribuciones que permite suspender tu equipo y despertarlo transcurrido un tiempo y que es el motivo de este post.

En casa tengo un pequeño servidor en linux configurado con deluge (para descargas p2p)+transdroid en el telefono para monitorizarlo, openvpn, mysql para compartir la biblioteca de xbmc,  samba y zoneminder como cttv de un par de camaras ip.

El equipo esta configurado para que se suspenda al tras 1 hora de inactividad, WOL en bios, y el plugin prevent suspend de deluge para que este no se suspenda mientras existen descargas activas.

Dentro de la red hay varios  equipos con Xbmc (Macmini en en salon, cocina y pc-gamer en la batcueva) y todos tienen configurado  el pluggin WOL de XBMC que despierta el server cuando alguno de estos se ejecuta, pero sería es interesante que el equipo se «despierte» a una hora determinada, por ejemplo cuando volvemos del trabajo o a primera hora de la mañana.

El comando en cuestión es rtcwake, un programa que permite poner nuestro sistema en estado de “letargo” hasta una determinada hora. Esta herramienta tiene la posibilidad de establecer el tipo de “letargo” que queremos utilizar, conforme a las estados definidos por la ACPI para el estado G1 – “sleeping“:

standby, que se corresponde con el estado S1, definido en la ACPI, y que representa un ahorro mínimo de energía (aunque real). Las CPUs dejan de ejecutar instrucciones, pero se mantiene la alimentación tanto a las CPUs como a la memoria RAM. Este es el modo por defecto que tiene rtcwake.
mem, se corresponde con el estado S3 (suspender a RAM), y representa un ahorro significativo de energía. Todo en el equipo se pone en estado de consumo mínimo de energía, excepto la memoria, que permanece en estado de auto refresco para mantener el contenido de la misma.
disk, se corresponde con el estado S4 (suspender a disco), y es el que ofrece un mayor ahorro de energía. Se comporta igual que el estado S3, pero con un paso adicional que es el de escribir el contenido de la memoria a disco.
off, se corresponde con el estado S5 (apagado), y que normalmente se ejecuta con “/sbin/shutdown”

El modo de uso de este comando es el siguiente:

rtcwake [-hvVluan] [-d device] [-m standby_mode] {-t time_t|-s seconds}

Las opciones para configurar rtcwake, son las siguientes:

v, información completa
-h, muestra la información sobre el uso de la aplicación
-V, muestra la información de la aplicación y sale
-n, establece una alarma, suspende o espera a que se produzca la alarma
-a, lee el modo del reloj de /etc/adjtime. que es la ubicación donde hwclock almacena la información. Este es la configuración por defecto
-l, asume que el reloj hardware está establecido a la hora local, sin tener en cuenta el contenido de /etc/adjtime
-u, asume que el reloj hardware está establecido a UTC (Universal Time Coordinated), sin tener en cuenta el contenido de /etc/adjtime
Si tu equipo tiene más de un RTC (esto es mas de un reloj en tu equipo), se puede especificar, utilizando la opción

-d device donde device es el nombre del reloj (rtc1,rtc2,…)
Para indicar cuando se tiene que despertar lo puedes hacer de dos formas, o bien, indicando los segundos que deben transcurrir desde el momento que ejecutes el comando, o bien, indicando el número de segundos transcurriddos desde el uno de enero de 1970 a las 00:00 UTC, que para simplificar el proceso lo puedes hacer utilizando el comando “date”. Así para indicar el día 25 de agosto de 2012, tendríamos que añadir date “+%s” -d “2012-08-25 06:30″. Lo indico como 2012-08-25, porque es el modo más cómodo y es mas complicado cometer un error, dado que los anglosajones son mas dados a poner los meses antes que los días, y este comando funciona así. De esta manera evitaremos errores.

Con esto, las opciones que tenemos son:

-s tiempo_t, donde tiempo_t, es el tiempo en segundos que transcurrirán desde ahora hasta que el sistema se inicie
-t tiempo_t, donde tiempo_t, es el tiempo en segundos desde 01-01-1970…, hasta el momento en que queremos que se inicie el sistema, lo que es el tiempo en valor absoluto.Además tenemos que establecer el modo de letargo que queremos, de acuerdo a lo indicado anteriormente, añadiendo los siguientes modos adicionales:
no, en el que no se suspende, solo se establece una alarma de inicio
on, no se suspende pero se lee el RTC hasta que aparece la alarma. Se trata de un modo útil para realizar procesos de depuración
disable, deshabilita la alarma que se haya definido con anterioridad
show, muestra la información relatia a la alarma, con un formato como “alarm: off|on “, donde time es el momento en el que se producirá la alarma, por ejemplo “alarm: on.
De esta manera, si queremos que nuestro equipo se ponga en marcha mañana a las 08:15, pero sin suspenderlo de forma inmediata, podemos ejecutar (eso si como administrador) el siguiente comando:

sudo rtcwake -m no -t $(date +%s -d ‘tomorrow 07:15’)
Si queremos ver que la alarma está activada, y es correcta, ejecutaremos el siguiente comando:

sudo rtcwake -m show
Que nos devolverá algo como

alarm: on Tue Aug 21 06:14:55 2012
Si además queremos que cuando se reinicie el equipo se ejecute una aplicación (si son varias tendremos que crear un sencillo script), tendremos que unir al comando anterior el comando que queremos ejecutar. Por ejemplo, si queremos buscar en nuestro disco duro por bloques erróneos cuando se inicie, podemos ejecutar el siguiente comando:

sudo rtcwake -m no -t $(date +%s -d ‘tomorrow 08:15’) && sudo badblocks -v /dev/hda1 > bad-blocks

¿Hasta aquí todo bien? vamos a integrarlo con Cron

Primero, abrimos un terminal en linux.

Con crontab -e abriremos el gestor de tareas para nuestro usuario, como queremos que se ejecute en el sistema tendremos que hacerlo con permisos de root
Así que ejecutamos sudo crontab -e

Nos pedirá que elijamos un editor de texto por defecto, yo aconsejo nano por facilidad de uso.

Añadiendo nuevas tareas

Cada linea del cron es una tarea y están escritas con la siguiente secuencia:
minute(0-59) hour(0-23) day(1-31) month(1-12) weekday(0-6) commando, pudiendo usar carácter comodín para definir tareas repetitivas

A lo que vamos, queremos que el comando se ejecute todos los días a las 01:30h

30 01 * * * sudo rtcwake -m no -t $(date +%s -d ‘tomorrow 07:15’)

Damos a Ctr+X y guadamos

Problemas o salvedades

  • rtcwake se basa en RTC (real-time clock). En definitiva, se basa en el relog por hardware de la BIOS, si tenemos problemas de cortes de luz o la pila de la Bios está desgastada puede que no tengamos los resultados deseados.
  • Es un método algo empírico, si suspendemos la RAM o hibernamos rtcwake si irá al traste dependiendo de los drivers linux de nuestro hardware en concreto y como nuestra BIOS gestiona los modos de energía.

Apéndice

Suspender, Hibernar y estados S0 S1 S2 S3 S4 S5 G3
S0 «Working»: Es el estado habitual del ordenador cuando está encendido. Los dispositivos que no se usen pueden ahorrar energía entrando en un estado de baja energía.
S1 POS: Es el primer estado del tipo «Sleep». En este modo el ahorro energético es bastante reducido, pero a cambio es el que menos tarda en reestablecer el sistema a como estaba antes. Se guarda la caché de la CPU y ésta deja de funcionar, pero se mantiene alimentada. También se mantienen alimentados la RAM y los ventiladores.
S2: Es el segundo estado de tipo «Sleep». Es igual que el S1 solo que se deja de alimentar la CPU.
S3 STR: El tercer y último estado de tipo «Sleep». Es el famoso «Suspender». Cuando dejamos el ordenador en S3 únicamente se mantiene alimentada la RAM, así que se mantiene el estado de los programas y por esto tarda relativamente poco en volver a S0. Este es el que se debe usar si no vas a estar mucho tiempo sin volver a utilizar el ordenador. Además ya que la RAM tiene un consumo muy bajo, tendremos un ahorro notable de la batería que si lo dejamos en S0.
S4: El estado Hibernar. En este caso se hace todo o que en S3 solo que el contenido e la memoria se guarda en el disco duro y a continuación se apaga el PC. Este modo es muy seguro ya que guarda en HDD todos los datos y en caso de falta de alimentación se mantiene todo. La desventaja es el tarda mucho más en volver a S0.
S5 «Shutdown»: Es el estado de apagado de toda la vida. El ordenador se encuentra en standby por lo que el consumo es muy reducido (casi 0). Tendrá que encender desde cero.
G3 «Mechanical Off«: Es cuando el sistema no recibe ninguna alimentación, por lo que el ordenador está totalmente apagado y no consume ninguna energía (si nos ponemos tiquismiquis, realmente la pila de la BIOS va perdiendo un poquito de carga siempre, pero eso va aparte de la alimentación externa :P). No es muy recomendable andar estando en este estado, ya que hay muchas piezas en el ordenador que sufren un estres térmico y se van dañando.

 

Bibliografía

http://mejorarpc.blogspot.com.es/2011/08/suspender-hibernar-y-estados-s0-s1-s2.html

http://www.howtogeek.com/101288/how-to-schedule-tasks-on-linux-an-introduction-to-crontab-files/