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 un montón de consejos que debes saber para que funcione siempre y los veremos en detalle. Suponemos que te estarás preguntando cómo programar una tarea en una Raspberry Pi. Bueno, tendrás que usar una herramienta llamada crontab que te permite lanzar tareas con el usuario que desees, al iniciar la Raspberry o cuando quieras.

¿Qué es crontab?

Cron

Cron es un servicio que se inicia automáticamente en cada arranque de la Raspberry Pi y que permite al usuario ejecutar los 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

Una crontab es una herramienta que nos permitirá listar lo que queremos empezar, en un formato comprensible para 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 necesitas saber.

  • u: crontab abre el crontab de usuario actual por defecto, pero puede especificar cuál abrir (si tiene suficientes privilegios)
  • l: lista el contenido actual del crontab
  • e: edita el contenido actual de crontab
  • r: remover el contenido actual del crontab

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

¿Cómo programar una tarea?

Mi primera tarea programada

Es hora de actuar. Planeemos una tarea simple, así que abre crontab por primera vez con el comando:

crontab -e

Lo primero, tienes que elegir un editor. Te aconsejo que te mantengas en nano, así que mantén la opción por defecto y pulsa enter:

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

Eso es todo. Ahora estás en el editor de crontab, que está vacío y puede ser un poco aterrador si es la primera vez que accedes a él. No entres en pánico. Te explicaremos qué hacer.

En primer lugar, todas las líneas que empiezan con # son comentarios, no hacen nada y podemos ignorarlas. Nuestros cambios se harán al final del archivo, mueve el cursor hacia abajo con la flecha de abajo y copia esta línea:

* * * * * * echo `date` >> /home/pi/log

Guarda el archivo (CTRL+O y Enter) y salir (Ctrl+X)

Esta simple línea en el crontab nos permitirá ejecutar un comando cada minuto, el cual escribirá la fecha en un archivo. Después de unos minutos, el archivo contendrá las fechas de ejecución del comando. Probablemente te estés preguntando qué significan las cinco estrellas.

La sintaxis de una entrada en el crontab es la siguiente:

1 2 3 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 simple para estar seguros de que está claro. Imagina que quieres ejecutar un script de copia de seguridad todos los miércoles a medianoche. Debes 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

Hay entonces muchas posibilidades para hacer coincidir el crontab con lo que necesitas

  • Iniciar un script en horas fijas
    0 6,12 * * * * /home/pi/backup.sh => se ejecutará sólo en 6 y 12
  • Iniciar un script cada 2h
    0 */2 * * * * /home/pi/backup.sh => se ejecutará cada 2 horas (así que 0, 2, 4, 6, ….)
  • Programar un script sólo durante los días laborables
    0 3 * * * 1-5 /home/pi/backup.sh => no se ejecutará el sábado/domingo
  • También puedes iniciar algo en el arranque
    @reboot /home/pi/backup.sh => se ejecutará en cada arranque

Debugg

Veremos al final del artículo cómo depurar un cron que no se inicia, o que no se inicia en el momento que has planeado. 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:

  • Para registrar un archivo que el script habría mostrado en la pantalla si lo hubiera lanzado manualmente, debes 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.
  • Así que si quieres añadir una nueva línea al final del archivo, tienes que añadir el carácter «>>», como este:
    @reboot /home/pi/backup.sh >> /home/pi/log_backup.txt
  • Ahora, si desead registrar los errores en otro archivo, tiened que añadir esto :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt 2>/home/pi/errors_backup.txt
  • Y finalmente, si deseas guardar los errores y los que se muestran en el mismo archivo, puedes hacerlo:
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt 2>&1

Ya deberías estar empezando a entender los pequeños trucos, pero desafortunadamente en TI las cosas raramente suceden como se esperaba. Te daremos algunos consejos para arreglar los errores con los crons de tu Raspberry Pi.

Consejos para Crontab

Privilegios de usuario

Un error común al crear crons es olvidarse de considerar los privilegios del usuario que iniciará el cron. Por ejemplo, este cron en el usuario por defecto de la Rapsberry («pi») no funcionará:

@reboot /usr/sbin/service ssh start

Obtendrás un error como este:
Failed to start ssh.service: Interactive authentication required. «No se pudo iniciar ssh.service: Se requiere autenticación interactiva.»

Si utilizas la pestaña del usuario actual, el cron se ejecutará con sus privilegios actuales.
Pi is not allowed to start a service, so it can’t work «Pi no está autorizado a iniciar un servicio, por lo que no puede funcionar»

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

Absolute path

Otro error generalizado al usar crons es ignorar la ruta del archivo. Debes utilizar la ruta completa para que funcione correctamente Este cron no funcionará, ni siquiera en el crontab raíz:

@reboot service ssh start

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

También debes prestar atención al contenido de tus scripts. Por ejemplo, si tienes un script PHP que incluye otro archivo (ej: include «file.php»), y agregas este script al crontab, no funcionará. Necesitarás añadir la ruta absoluta en el include de la función o hacer algo así:

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

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

Debug

Además de lo que escribí anteriormente, hay otros dos métodos que voy a introducir para depurar tus crons.

Correo electrónico

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 tu Raspberry Pi, puedes comprobar los errores en el archivo de correo electrónico de tu usuario

Puedes instalar uno fácilmente haciendo:

sudo apt-get install mailutils

Después de eso, 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 ayuda valiosa para comprobar lo que pasó 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

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

Conclusión

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 qué no funcionaba como querías. Los Crons son algo fundamental en Raspberry Pi y Linux en general. Esperamos que entiendas mejor cómo funcionan, te servirá muy a menudo.

Si tiene dudas sobre la planificación de un cron, debes saber que hay sitios web que te permiten crear tu tarea o comprobar si lo que hiciste es lo que querías. Por ejemplo, uno de ellos es crontab.guru.

Programar tareas con CRON

Pin It on Pinterest

Shares