Programar Encendido de PC

Hace un par de días publicaban en Linux.com un artículo que me gustó mucho, consistía en usar el RTC (Real Time Clock) de la placa base para programar el encendido del PC a través del pseudo-sistema de fichero /sys.

La idea se basa en escribir en uno de los pseudo ficheros la hora a la que se desea encender la máquina. No se necesita nada más.

Uno de los beneficios que no ofrece en nuestro día a día sería poder programar un apagado por algún mantenimiento que nosotros no controlamos (podrían cortar la luz para alguna reparación) y programar un encendido cuando estimemos que se ha terminado ese mantenimiento.

Para empezar debemos comprobar que nuestra versión de Kernel soporta rtc lo vemos así:

# grep -i rtc /boot/config-$(uname -r)

Que debe devolver:

[...]
CONFIG_HPET_EMULATE_RTC=y 
CONFIG_PM_TRACE_RTC=y 
CONFIG_RTC_LIB=y 
CONFIG_RTC_CLASS=y 
CONFIG_RTC_HCTOSYS=y 
CONFIG_RTC_HCTOSYS_DEVICE="rtc0" 
[...]

También es posible verlo a través de los logs del Kernel:

# grep -i rtc /var/log/messages 
# grep -i rtc /var/log/kern.log

Que debe salir:

Dec  2 08:14:38 asgard kernel: [    0.853916] rtc_cmos 00:03: RTC can wake from S4
Dec  2 08:14:38 asgard kernel: [    0.854031] rtc_cmos 00:03: rtc core: registered rtc_cmos as rtc0
Dec  2 08:14:38 asgard kernel: [    0.854053] rtc0: alarms up to one month, y3k, 114 bytes nvram, hpet irqs
Dec  2 08:14:38 asgard kernel: [    0.855641] rtc_cmos 00:03: setting system clock to 2012-12-02 07:14:23 UTC (1354432463)

Aquí muestra un par de cosas interesantes, la primera es que el reloj está sincronizado UTC e implica que no debemos tener en cuenta el cambio de horario de verano/invierno y que el dispositivo es rtc0, podría pasar, aunque es poco frecuente, que hubiera más de uno.

Probando

Ahora ya estamos listos para probar el invento, para ello solo necesitamos dos pasos:

Primero poner a cero el contador de la alarma:

# echo 0 > /sys/class/rtc/rtc0/wakealarm

Y segundo poner la alarma:

# echo $(date '+%s' -d '+ 3 minutes') > /sys/class/rtc/rtc0/wakealarm

Si ahora hacemos un cat del fichero veremos un número como este 1354444166 que es la fecha en formato epoch (segundos transcurridos desde el 1 de enero de 1970) y es el formato de tiempo que usa UNIX internamente.

Ahora podemos apagar el PC y ver como pasados los tres minutos arranca de nuevo.

A partir de aquí ya podemos escribir un script que simplifique la tarea, si queremos que se apague a cierta hora y se encienda de nuevo sin que tengamos que preocuparnos. O cosas así.

Referencia

Artículo original publicado por Carla Schroder en Linux.com con licencia Creative Commons 3.0

5 Comments.

  1. Hola!!

    hacía mucho tiempo que buscaba algo así! Había visto lo típico de através de la tarjeta de red, pero tenía que ser una tarjeta de red especial y enviar la señal desde otro equipo etc etc. ¡Pero esto de usar el reloj del sistema es una gran idea!

    De todos modos lo estoy intentando y algo debe pasar. No hay forma de modificar el fichero /sys/class/rtc/rtc0/wakealarm
    Lo he probado con sudo, y todo ok no da ningún error pero al ver el contenido del fichero, está vacío.
    Probando con root me ha pasado lo mismo, no da ningún error pero siempre se queda vacío.

    He probado a modificarlo manualmente con vi y me da el siguiente error:
    “/sys/devices/pnp0/00:03/rtc/rtc0/wakealarm” E667: Fsync failed

    ¿Alguna idea? Gracias!

  2. Hola Edu!

    Es cierto que si lo haces con vim a mi también me da error.

    Has seguido los pasos de poner la alarma a 0 y luego pasarle la fecha de apagado?

    Saludos.

  3. Hola Fede,

    te cuento lo que hago, logado como root:
    > echo 0 > /sys/class/rtc/rtc0/wakealarm
    Esto ok, no da ningún tipo de mensaje de error

    > echo $(date ‘+%s’ -d ‘+ 3 minutes’) > /sys/class/rtc/rtc0/wakealarm
    También ok, sin errores

    Después simplemente hago un:
    > more /sys/class/rtc/rtc0/wakealarm

    A ver si tiene algo escrito y nada, no muestra nada. Y hago por una parte:
    > echo $(date ‘+%s’ -d ‘+ 3 minutes’)

    Me copio el resultado y lo intento escribir en /sys/class/rtc/rtc0/wakealarm con vi y da el error “/sys/devices/pnp0/00:03/rtc/rtc0/wakealarm” E667: Fsync failed

    Debería aparecer algo en ese fichero si lo edito ¿no?

  4. Bueno es un poco extraño lo que ocurre. Según he leído en la página de manual de Linux cuando se introduce un dato incorrecto o no, ya no se puede meter otro, esto pasa porque se producen interrupciones y parece que el fichero se bloquea (por eso da fallo con un editor de texto).

    Por otra parte he leído en un foro que si lo haces con sudo y todo el comando tienes que ajustar ciertos permisos para el acceso sin contraseña.

    En definitiva, creo que lo que he sacado en claro es que una vez que arranques el portátil, entras en consola y lo pruebas directamente haciéndote root con sudo -s debería funcionar bien.

    Ya me cuentas.
    Saludos

  5. Lo he intentado varias veces y en principio no me va. Pero seguiré probando cosas y te aviso con lo que averigüe 😉

    Gracias, saludos.