¿Cómo Programar una Tarea en una Raspberry Pi?

Programar comandos o scripts en una Raspberry Pi, y en Linux en general, no es fácil para un principiante.
Hay muchos consejos que debes conocer para que funcione siempre, y vamos a verlos en detalle.

Para programar una tarea en Raspberry Pi, existe una herramienta llamada «crontab».
Esta herramienta es útil para ejecutar un script a una hora determinada o al arrancar.

¿Qué es esto? Te lo explicaré 🙂

Si estás buscando progresar rápidamente en Raspberry Pi, puedes consultar mi libro electrónico aquí. Es un reto de 30 días en el que aprendes una cosa nueva cada día hasta que te conviertes en un experto en Raspberry Pi. El primer tercio del libro te enseña lo básico, pero los siguientes capítulos incluyen proyectos que puedes intentar por tu cuenta.

¿Qué es crontab?

Cron

Cron es un servicio, iniciado automáticamente en cada arranque de la Raspberry Pi, que permite al usuario ejecutar comandos programados.

Cada minuto, cron observará si tiene que hacer algo y lo hará.
Lo que vamos a ver hoy es cómo decirle a cron que ejecute nuestro comando o script cuando sea necesario.

Crontab

Un crontab es una herramienta que nos permitirá listar lo que queremos arrancar, en un formato comprensible por el servicio cron.

Un crontab contendrá dos cosas:
– la lista de comandos a ejecutar
– cuándo ejecutarlas

Crontab también es un comando. Aquí está la sintaxis :

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

Lo que hay que saber :

  • u: crontab está abriendo el crontab del usuario actual por defecto, pero puedes especificar cuál abrir (si tienes suficientes privilegios)
  • l: listar el contenido actual de crontab
  • e: editar el contenido actual de crontab
  • r: eliminar el contenido actual de crontab

La mayoría de las veces, sólo utilizará los comandos «crontab -l» o «crontab -e».

Espera, ¡tengo algunas recomendaciones para ti!

Antes de continuar, te invito a descubrir algunos productos que he seleccionado cuidadosamente para ti. Creo que son esenciales para tu Raspberry Pi. Échales un vistazo y pídelos directamente en Amazon.

Una caja silenciosa y práctica Un SSD de alto rendimiento para potenciar tu Pi Una pantalla genial para liberar el televisor Un teclado dedicado con touchpad

Programar una tarea en Raspberry Pi

Obtiene mi hoja de trucos de comandos
Obtiene su archivo PDF gratuito con todos los comandos que necesitas saber sobre Raspberry Pi.
Descargar

Añadir un cron

Es hora de pasar a la acción.
Siga este procedimiento para programar una tarea en su Raspberry Pi:

  • Edita el crontab con el comando:
    crontab -e
  • En el primer uso, debes elegir un editor.
    Te aconsejo que te quedes en nano, así que mantén la opción por defecto y dale a enter :

    pi@raspberrypi:~ $ crontab -e
    no crontab for pi - using an empty one
    Select an editor. To change later, run 'select-editor'.
    /bin/ed
    /bin/nano <---- easiest
    /usr/bin/vim.tiny
    Choose 1-3 [2]:

  • Ya está. Ahora estás en el editor de crontab, que está vacío y puede dar un poco de miedo si es la primera vez que accedes 🙂
    Que no cunda el pánico. Te explicaré qué hacer
  • Todas las líneas que empiezan por # son comentarios y no hacen nada.
    Podemos ignorarlos.
    Nuestros cambios se harán al final del archivo
  • Mueva el cursor hasta el final del archivo y pegue esta línea:
    * * * * * echo `date` >> /home/pi/log
  • Guardar el archivo (CTRL+O y Enter) y salir (Ctrl+X)

Esta simple línea en el crontab nos permitirá ejecutar un comando cada minuto, que escribirá la fecha en un archivo.
Transcurridos unos minutos, el archivo contendrá las fechas de ejecución del comando.

Probablemente se pregunte qué significan las cinco estrellas.
La sintaxis de una entrada en el crontab es la siguiente:

1 2 3 4 5 command
  • 1: Minuto (entre 0 y 59)
  • 2: Hora (entre 0 y 23)
  • 3: Día (entre 1 y 31)
  • 4: Mes (entre 1 y 12)
  • 5: Día de la semana (entre 0 y 7, a partir del Domingo)

Ejemplo básico

Ahora que entiendes la teoría, veamos un ejemplo sencillo para asegurarnos de que está claro.
Imagine que deseas ejecutar un script de copia de seguridad todos los miércoles a medianoche.
Debe añadir una línea como esta :

0 0 * * 3 /home/pi/backup.sh

Medianoche para los dos primeros 0, y 3 para el día de la semana (miércoles).

Otros ejemplos

Luego hay muchas posibilidades de hacer coincidir el crontab con lo que necesitas.

  • Lanzar un script a horas fijas
    0 6,12 * * * /home/pi/backup.sh   => will run at 6 and 12 only
  • Iniciar un script cada 2h
    0 */2 * * * /home/pi/backup.sh => will run every 2hours (so 0, 2, 4, 6, ...)
  • Programar un script sólo durante los días laborables
    0 3 * * 1-5 /home/pi/backup.sh => will not run on Saturday/Sunday
  • También puedes iniciar algo al arrancar
    @reboot /home/pi/backup.sh   => will run at every boot

Añadir depuración

Veremos al final del artículo cómo depurar un cron que no arranca, o no lo hace a la hora prevista.
Pero puede ser más fácil guardar los mensajes mostrados o los errores de script en un archivo.

Para ello, debes añadir una de estas opciones en el crontab:

  1. Para registrar en un archivo lo que el script habría mostrado en pantalla si lo hubiera lanzado manualmente, debe especificar el nombre del archivo con el carácter «>» :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt
    Pero esta opción borrará el archivo en cada ejecución
  2. Por lo tanto, si deseas añadir una nueva línea al final del archivo, tienes que añadir el carácter «>>», así :
    @reboot /home/pi/backup.sh >> /home/pi/log_backup.txt
  3. Ahora si quieres registrar los errores en otro fichero tienes que añadir este :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt 2>/home/pi/errors_backup.txt
  4. Y por último, si quieres guardar los errores y lo mostrado en el mismo archivo, puedes hacerlo así :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt 2>&1

Ya deberías estar empezando a entender los pequeños trucos, pero por desgracia en informática las cosas rara vez suceden como se espera.
Te daré algunos consejos para solucionar los errores con los crons en tu Raspberry Pi.

Obtiene mi hoja de trucos de comandos
Obtiene su archivo PDF gratuito con todos los comandos que necesitas saber sobre Raspberry Pi.
Descargar

Consejos Crontab

Obtiene mi hoja de trucos de comandos
Obtiene su archivo PDF gratuito con todos los comandos que necesitas saber sobre Raspberry Pi.
Descargar

Privilegios de usuario

Un error común al crear cron es olvidar tener en cuenta los privilegios del usuario que iniciará el cron.

Por ejemplo, este cron en el usuario por defecto de la Raspberry («pi») no funcionará :

@reboot /usr/sbin/service ssh start

Aparecerá un error como este :
Failed to start ssh.service: Interactive authentication required.

Si utiliza el crontab del usuario actual, el cron se ejecutará con sus privilegios actuales.
Pi no puede iniciar un servicio, por lo que no puede funcionar.

Para que esto funcione, debe añadir esta línea en el crontab raíz (sudo crontab -e) o en el crontab global que se encuentra en /etc/crontab.

Ruta absoluta

Otro error muy extendido al utilizar crons es ignorar la ruta del archivo.
Debe utilizar la ruta completa para que funcione correctamente.

Este cron no funcionará, incluso en el crontab raíz :

@reboot service ssh start

Si no se especifica la ruta absoluta, cron no sabrá dónde se encuentra el archivo de servicio.
Así que tienes que escribir /usr/sbin/service para que este cron funcione.

Presta también atención al contenido de sus scripts.
Por ejemplo, si tienes un script PHP que incluye otro archivo (ej: include «file.php»), y añades este script al crontab, no funcionará.
Tendrás que añadir la ruta absoluta en el include de la función o hacer algo como esto:

@reboot cd /var/www/html; /usr/bin/php test.php

De esta forma, la inclusión se hará en /var/www/html y el script PHP encontrará el archivo «file.php».

Depuración

Además de lo que he escrito arriba, hay otros dos métodos que voy a introducir para depurar tus crons.

Correos electrónicos :

Cron enviará un correo electrónico al usuario si hay un problema con una de sus tareas programadas en el crontab.
Si tienes un servidor de correo instalado en su Raspberry Pi (como se explica aquí, en inglés), puedes comprobar los errores en el archivo de correo electrónico de su usuario.

Puedes instalar uno fácilmente haciendo :

$ sudo apt-get install mailutils

Después, puedes escribir «mail» para leer tus correos electrónicos

Si tienes un servidor de correo electrónico bien configurado, puedes redirigir los correos electrónicos a tu dirección de correo electrónico añadiendo algo como esto a su crontab :
MAIL=yourname@provider.com

Syslog :

Syslog es otra valiosa ayuda para comprobar qué ha pasado con tus crons.
Es un archivo de registro ubicado en /var/log/syslog.

Puedes leer los últimos mensajes sobre crons con este comando :

tail -f /var/log/syslog | grep CRON

Y te mostrará los últimos errores, con actualización en tiempo real si se inicia un nuevo cron.

Obtiene mi hoja de trucos de comandos
Obtiene su archivo PDF gratuito con todos los comandos que necesitas saber sobre Raspberry Pi.
Descargar

Conclusion

Ahora ya sabes lo que es un cron y un crontab, cómo programar una tarea o un script en Raspberry Pi con muchas opciones y cómo averiguar lo que no funciona como quieres.

Los crons son algo fundamental en Raspberry Pi y Linux en general.
Espero que entiendas mejor como funcionan, te servirá muy a menudo.

Si tienes dudas sobre cómo planificar un cron, debes saber que existen sitios web que te permiten crear tu planificación o comprobar si lo que has hecho es lo que querías.
Por ejemplo, crontab.guru lo hará por ti.

Cuando estés preparado, aquí tienes un atajo para ti:

Domina tu Raspberry Pi en 30 días: Si buscas los mejores consejos para convertirte en un experto en Raspberry Pi, este libro es para ti. Aprende habilidades útiles de Linux y practica múltiples proyectos con guías paso a paso.

Publicaciones Similares