Pantallas informativas (VII): Programado de encendido y actualizaciones con crontab

En las anteriores entradas hemos estado hablando de automatizar y apagar, ahora toca encender la pantalla y ejecutar las tareas a su hora, y eso lo vamos a hacer muy fácil con crontab.

Vamos a definir:

    • Ejecución de comandos y scripts al iniciar.
    • Actualización del calendario a las 6 am.
    • Encendido de la pantalla a las 9 am.
    • Comprobar actualizaciones de ficheros cada 30 minutos.
    • Comprobar IP cada 15 minutos.

Como paso previo, damos a todos los scripts que hemos hecho permisos de ejecución con el comando:

chmod +x nombre_del_script.sh

Y ahora programamos su ejecución con crontab.

Sin extendernos mucho, porque no lo voy a hacer mejor que el peor manual de Linux, para programar con crontab la forma es:

* * * * * nombre_del_script.sh

Y los asteriscos, comenzando por la izquierda, son:

      • minuto
      • hora
      • día de la semana
      • mes
      • día del mes

Así, si a las seis de la mañana queremos que se actualicen los ficheros de fechas, pondremos lo siguiente:

* 6 * * * /home/pi/actualizadia.sh

Fácil, ¿no?

Si queremos que una tarea se ejecute cada 15 minutos en el primer asterisco pondremos */15, que vendría a decir «cada 15», ya que si ponemos sólo 15 la tarea se ejecutará en el minuto 15 de cada hora, no cada 15 minutos. Así:

*/15 * * * * /home/pi/queip.sh

Y si queremos que algo se ejecute al iniciar la Raspberry pues ponemos @reboot loquesea.

Bien, pues ahora que sabemos qué queremos hacer y cómo, nos ponemos manos a la obra.

Editamos crontab, como pi, con el siguiente comando:

crontab -e

Y la primera vez nos preguntará por nuestro editor de textos favorito, yo me apaño bien con nano, pero para gustos colores, podéis seleccionar el que queráis.

Una vez dentro del fichero veremos un montón de líneas comentadas, pues al final colocamos las nuestras:

@reboot sleep 10 && /home/pi/iniciando.sh > /dev/tty1; /home/pi/actualizadia.sh; /home/pi/actualiza.sh; /home/pi/fecha.sh &
#
* 6 * * * /home/pi/actualizadia.sh &
#
* 9 * * * /home/pi/fecha.sh &
#
*/15 * * * * /home/pi/queip.sh &
#
*/30 * * * * /home/pi/actualiza.sh &

Al iniciar le decimos que espere 10 segundos, para dar un poco de tiempo a que acabe de cargar todo antes de comenzar a ejecutar los scripts.

Primero ejecutará iniciando.sh que es el que se encarga de comprobar la wifi. Podríamos haber hecho eso mismo con el sistema, pero prefiero hacerlo así y ver que tengo conexión y una mínima indicación en pantalla por si en algún momento algo va mal.

Y aquí vemos que la salida se ha enviado a /dev/tty1, la pantalla, porque este script lo está ejecutando crontab, no nosotros, y él no necesita pantalla. Por ello, los scripts que hemos hecho hasta ahora habrá que modificarlos ligeramente teniendo en cuenta esto, que habrá que mandar la salida a /dev/tty1 y que si hay que borrar habrá que cambiar el clear por clear_screen. Luego lo vemos porque en realidad son cuatro cambios.

Siguiendo con la línea del inicio, ejecutamos también el fichero de actualización de fechas y luego el de archivos y por último el fecha.sh que será el que compruebe qué tipo de día es y según eso lance el script principal proyecta.sh. Este último será el que tengamos que modificar más cuidadosamente.

Y el resto de líneas es lo comentado anteriormente según lo definido al inicio.

Por legibilidad hemos dejado una línea en blanco, comentada, entre medio de cada línea de tareas programada, pero es completamente optativo esto.

Modificación del fichero proyecta.sh

Bien, como este script es lanzado por otro que a su vez lo ejecuta crontab, cuando decimos en él «borrar pantalla» tenemos que decir «qué pantalla», así que dirigiremos el comando a /dev/tty1 en estas líneas:

Fácil. Modificamos las líneas necesarias y hemos dejado comentadas las viejas para mejor comprensión.

En esta entrada no pego el código completo del script porque en la siguiente estarán todos los ficheros empaquetaditos y los cambios como se puede ver son mínimos.

Y esto ya casi está. En la siguiente entrada hacemos un repaso, vemos cómo preparar el sistema para más pantallas, para otros usuarios, clonar tarjetas y listo.


Ficheros tratados en esta entrada

    • proyecta.sh (script principal)
    • crontab

 

4 respuestas a «Pantallas informativas (VII): Programado de encendido y actualizaciones con crontab»

    1. Estimado Ismael.

      No sabes lo que me alegro de que te esté funcionando, en serio, es una gran satisfacción para mí el saber que a alguien le está siendo útil todo esto.

      Por otra parte, lamento los problemas que te está dando el wordpress con los comentarios, parece que se ha puesto un poco exquisito y este último te lo ha dejado “pendiente de moderación”, cuando no está configurado así… No sé qué le pasa, al menos me avisa por mail.

      Bueno, al lío:

      No, las claves del servidor no tienes que almacenarlas en un nuevo archivo sino añadirlas al final de authorized_keys. Te aconsejo que antes te hagas una copia del authorized_keys por si las moscas. Luego si la nueva clave se llama key2.pub y la pones en el home, por ejemplo, pues en el servidor habría que hacer:

      cat key2.pub >> .ssh/authorized_keys

      Ese fichero puede contener tantas claves como necesites.

      Los pasos los tienes más o menos indicados en la entrada IX:

      https://www.wampirius.com/pantallas-informativas-ix-resumen-ajustes-para-anadir-pantallas-como-adaptar-para-otros-usuarios-y-ficheros-para-descargar/

      No obstante tengo que preparar una entrada específica para esto porque me ha dado un par de quebraderos de cabeza de lo más tonto, pero ya que estamos aquí te comento:

      Yo lo que hago es guardar una imagen de la tarjeta que tenga en uso y con esa imagen grabo una tarjeta para una nueva Raspberry, pero antes de guardar la imagen de la tarjeta, comenta las líneas del crontab para que no ejecute los scripts (añadir # al principio de cada línea), que simplemente se quede en el prompt.

      Una vez que grabes la tarjeta y arranques la Raspberry con ella, entra en el escritorio, que te será mucho más fácil todo. Para entrar: startx

      Una vez allí:

      -Ponemos la Raspberry en fecha y hora o si no no pillará la WiFi (al menos si es que estamos con Eduroam u otra WiFi que precise certificados –esta solemne estupidez me llevó de cabeza ni sé las horas-). Es fácil:

      Desde la línea de comandos: sudo date mmddHHMM

      Es decir: mm mes, dd día, HH hora, MM minutos. Si estamos cambiando la fecha para el mismo año, si no hay que añadir también el año al final: sudo date mmddHHMMccyy Siendo cc los dos primeros dígitos del año, que son opcionales, y yy los últimos.

      -Cambiamos el nombre del host

      Ahora, desde una ventana de línea de comandos:

      -Generamos un nuevo par de claves
      -Cambiamos la clave privada que hubiera por la nueva
      -En el servidor se añade, tal como te comentaba antes, la clave pública al final de authorized_keys
      -Conectamos “a mano” con el servidor, puesto que la primera vez suele pedir confirmación. Tal como pone en la entrada, desde la Raspberry:

      ssh -i /home/pi/.ssh/miclave pi@ip_del_servidor

      Cuando veamos que hemos conectado, exit y listo. Ya está.

      -Sólo nos queda entrar de nuevo en crontab y quitar los comentarios a las líneas que nos interesan para que tras reiniciar se comporte como queremos.

      Como ves hay alguna variación respecto a lo que pone la entrada, a ver si lo añado a la existente.

      Y bueno, esto no tiene mucho que ver, pero también alguna Raspberry me ha sorprendido, y no muy gratamente, al tirarse varios minutos con la pantalla en negro al arrancar. Si te pasa, es cosa del Mutt, el cliente de correo, que no sé por qué, la primera vez puede tardar varios minutos en mandar el correo y deja a la pobre Raspi medio cuajada, luego ya va normal. No es algo que me pase siempre ni en todas, pero en ocasiones se ha llegado a tirar hasta seis minutos de reloj hasta “conectar con el servidor”. He probado varias “soluciones” que he encontrado por Internet, pero sin éxito. Te aviso por si acaso, si te pasa, dale unos minutos a ver, no pienses de entrada que has hecho algo mal o no funciona (yo lo pensé 😉 )

      Suerte con el clon y un cordial saludo!

      Carlos.

  1. No se que pasa que no me deja colocar el comentario, pero intento nuevamente:
    Muchas gracias Carlos, ya funciono, aunque noto un comportamiento extraño, por ejemplo al hacer el actualiza.sh me pedía privilegios, así que le di permisos 700 a la carpeta Videos, con esto ya funciono, pero también pasa que si tengo 5 fotos en la carpeta y si agrego 5 nuevas fotos, las sincroniza, pero estas no se reproducen en la pantalla, solo reproduce las primeras 5 fotos, hasta que reinicio. también creo que no me funciona el colocar archivos xxx.001, xxx.002 para funciones de reinicio, fin, etc.

    1. Hola Ismael

      Me alegro que el problema anterior funcionara y este seguro que también lo resolvemos.

      No recuerdo haber tenido el problema que comentas de privilegios en las sincronizaciones, por lo menos en este caso. Pero vamos, que no lo recuerde no quiere decir que no lo tuviera. Hice mil pruebas y lo mismo en una de ellas lo solucioné tipo el cuento de “el burro y la flauta”. De todos modos, tanto el usuario del “servidor” (lo entrecomillo, porque es que si vieras el cacharro que nos haciendo de servidor…) y la Raspberry es el mismo, y a lo mejor eso es lo que me evitó los problemas que te han aparecido, pero no estoy seguro.

      Tema reproducción:

      Ojo porque la reproducción de los archivos que se meten nuevos no es instantánea. Fíjate que en la línea 44 de proyecta.sh (el fichero completo, antes de borrar las líneas que comentábamos anteriormente), en esa línea es donde se comienza a recorrer el directorio (y un par de líneas antes donde se refresca) y a mostrar de uno en uno los archivos. Es decir, si tenemos un directorio, por ejemplo:

      1.jpg
      2.jpg
      3.jpg

      Si metemos un cuarto archivo 4.jpg y la pantalla está en esos momentos mostrando el 2, cuando llegue al 3 saltará al 1, porque todavía no había refrescado el directorio y “no sabe” que está ahí.

      Truco: yo para las pruebas lo que hacía era bajarle el tiempo: En la línea 83:

      fim $file -a -c ‘{sleep 20;quit;};’

      el sleep 20 lo cambiaba por sleep 2 y listo, que con tener dos segundos la imagen era más que suficiente para ver si funcionaba.

      Pero ojo. Si este no fuera el caso, si me dices que tras sincronizar las carpetas ves que realiza dos o tres bucles y no muestra las nuevas imágenes, entonces habrá que buscar por otro lado.

      Ah! Y una cosita importante: Los nombres de fichero NO deben de contener espacios. Lo mejor, limitarnos a letras y números, evitando acentos, “ñ”, etc. Con esto seguro que no tenemos problemas.

      Tema “ficheros especiales”:

      Dos cosas: Por un lado está lo dicho antes, no son instantáneos, cuando se refresca el directorio y les llega su turno, pues entonces harán lo que corresponda.

      La segunda: Ojo también a los nombres de fichero. Ese “xxx” que has puesto debe ser el nombre del host de la raspberry. Si le has llamado “raspi1” pues raspi1.001 (ó 002 o lo que sea) para que la apague, reinicie, etc. Precisamente XXX antes del nombre de la pantalla se utiliza para proyectar un determinado archivo en una determinada pantalla.

      Suerte y ya me dirás.

      Un cordial saludo.

      Carlos

Deja una respuesta

No está permitida la inserción de ningún dato de carácter personal (mail, tef...). Cualquier comentario que los contenga será editado o eliminado.

Por favor, si dejas un comentario pon cualquier nombre para poderme dirigir a ti pero que no te identifique

El comentario es totalmente anónimo. No se almacena la IP