Cron es una herramienta que te permite ejecutar comandos de forma programada. Mientras el agente de cron esté corriendo, podrás especificar cosas como pedir que un script o comando se ejecute periódicamente, cada 15 minutos, cada minuto, cada hora, cada noche, cada domingo, cada sábado a las 14:37 horas, cada día 5 de mes a las 02:51 horas… En fin, que podrás hacerlo de forma muy flexible.
Para poder modificar las tareas programadas, puedes modificar el crontab, que es la tabla de tareas periódicas. En esta guía te quiero contar cómo modificar esta tabla y el formato de lo que debes poner en el archivo.
Tabla de contenidos
Introducción al crontab
Para cambiar la configuración de tu agenda puedes usar el comando crontab -e desde la línea de comandos. Si ejecutas este comando, se abrirá el editor de textos por defecto que tengas configurado en tu sistema, con un archivo que puede que esté vacío o que ya contenga cosas.
Dentro de este archivo, puedes meter tres tipos de línea:
- Líneas en blanco.
- Líneas que comienzan con un
#. Se denominan comentarios, y si no sabes de programación, te vienen bien para anotar cosas. El ordenador las va a ignorar, así que ahí es donde puedes dejar explicaciones o cualquier otro dato que quieras conservar para que puedas volver a leerlo más tarde con calma. - Líneas que contienen una tarea programada que quieres que cron ejecute.
Vamos a lo gordo porque realmente el formato puede resultar un poco confuso. Cada línea contiene un comando a ejecutar y el calendario que quieres que tenga.
Calendarios
El calendario especifica cuándo quieres que se repita la tarea. Por ejemplo, los jueves a las 15:30 o cada día 1 a las 02:00 AM. Para especificar el calendario, tienes que poner cinco números separados por espacios al principio de la línea. Estos cinco números siguen el siguiente formato:
minuto hora dia-del-mes mes dia-de-la-semana
Los rangos de los números son los esperables. Como minuto puedes poner un número comprendido entre 0 y 59; como hora uno entre 0 y 23. El día del mes se comprende entre 1 y 31, sabiendo que hay meses con menos días. El mes también está entre 1 y 12. Ahora bien, para el día de la semana, puedes usar un número de 1 a 7, donde 1 es lunes, 2 es martes… y así hasta 7, que es domingo; o bien puedes especificar también un 0 para el domingo, usando por lo tanto un número entre 0 y 6. Tal vez si administras sistemas esto te suene porque muchos sistemas usan esta notación igualmente, dejando el 0 para el domingo y el 6 para sábado.
Además de un número, puedes poner un asterisco (*) cuando quieras indicar que te da lo mismo lo que valga el campo. Por ejemplo, si quieres ejecutar una tarea todos los días, podrías usar asteriscos para los campos dia-del-mes, mes y dia-de-la-semana, para indicar que lo único que te importa es la hora, pero la fecha vale cualquiera. Por ejemplo, aquí van algunos calendarios:
30 18 * * *: ejecutaría una tarea todos los días a las 18:30. (Me da igual el día del mes, o el mes, o el día de la semana).0 2 1 * *: ejecutará una tarea cada día 1 a las 2 de la mañana. (Sea el mes que sea).0 6 * * 1: ejecutará una tarea cada lunes a las 6 de la mañana, sea el día que sea.
Otra cosa que puedes hacer es pedirle que se ejecute cada N minutos, o cada N horas, o cada N días. Para ello le pones un asterisco (*), seguido de una barra y de cada cuánto tiempo quieres que se repita. Por ejemplo, si quieres ejecutar una tarea cada 5 minutos, puedes usar */5 * * * *, que la ejecuta sea el día que sea o la hora que sea, cada 5 minutos.
Por último, también voy a indicarte que puedes usar directamente números separados por comas para tener una mayor precisión. Así que si quieres ejecutar una tarea a las 8 de la mañana el día 1 de enero, abril, julio y octubre puedes usar la secuencia 0 8 1 1,4,7,10 *.
Establecer un calendario es una tarea que puede resultar a veces complicada de depurar, así que te voy a mencionar este enlace para que puedas simular un calendario y traducir la explicación a humano: https://crontab.run/es.
Comandos
Finalmente, luego del calendario vendría el comando que quieras que se ejecute. Aquí, ten en cuenta que es bastante probable que se ignoren las variables de entorno que hayas podido declarar en tu terminal, así como otros directorios que hayas metido al PATH, que generalmente y salvo que lo reconfigures, sólo contendrá /usr/bin y /bin. Por lo tanto, mi consejo es que en cualquier caso uses rutas absolutas para cualquier comando que vayas a ejecutar y así evitar problemas.
Por ejemplo, la siguiente regla de cron ejecutaría el script /home/danirod/scripts/send_analytics.sh cada mañana a las 7:00:
0 7 * * * /home/danirod/scripts/send_analytics.sh > /home/danirod/scripts/log
Observa que puedo poner caracteres como > o 2> para enviar la salida del comando que esté ejecutando a un archivo. Esto es aceptado y es una forma excelente de poder luego ver qué ha pasado, sobre todo en caso de error, así que no pierdas de vista la ocasión de ponerlo y guardar el log en alguna parte para poder detectar errores si compruebas que las tareas programadas no se están ejecutando bien. Solo recuerda, de nuevo, que debes usar rutas absolutas, porque si no el archivo se podría guardar en ubicaciones inesperadas.
Permisos
Como consideraciones finales, ten en cuenta que cada usuario del sistema tiene su propio crontab, para especificar su propia agenda. Los comandos se lanzan siempre bajo el usuario al que le pertenece el crontab.
Eso significa que si ejecutas crontab -e con tu perfil, los comandos correrán en tu nombre y por lo tanto tendrán los permisos que tenga tu cuenta. La cuenta root tiene su propio crontab, que puedes modificar como sudo crontab -e (o cambiando antes a root si no tienes sudo), con el que podrás hacer cualquier cosa, aunque mi consejo es que no lo emplees salvo que necesites hacer tareas restringidas (por ejemplo, reiniciar el servidor web cada noche a golpe de comando de systemctl).