Ahora vamos con la automatización con Bash o los famosos cron jobs en Linux. Este tema cierra estos últimos post que han tratado sobre la programación en Bash. Creo yo que se han tratado los temas esenciales y ya depende de nosotros generar la complejidad en cada caso de uso.
Contenido
- Casos de uso comunes de cron
- ¿Qué son los Cron jobs en Linux?
- Crear y editar cron jobs
- Cron con variables de entorno
- Eliminar un cron job
- Buenas prácticas al usar cron
- Periodos de cron útiles
- Cada minuto
- Cada 10 minutos
- Cada hora
- Cada 12 horas
- Todos los días a las 12 de la noche
- Todos los días a las 6 de la mañana
- Todos los lunes a las 9 de la mañana
- El primer día de cada mes a medianoche
- El primer lunes de cada mes a las 8 de la mañana
- Una vez al año, comenzando el 16 de septiembre
- Cada seis meses, comenzando el 16 de septiembre
- Cada tres meses, comenzando el 16 de septiembre
- Cada dos años, comenzando el 16 de septiembre
- Cada 15 minutos, pero solo entre las 9:00 AM y las 5:00 PM, de lunes a viernes
- Cada 15 minutos, pero solo entre las 9:00 AM y las 5:00 PM, de lunes, miércoles y viernes
Automatizar tareas en Linux es una de las formas más eficaces de mejorar la productividad. Estar haciendo tareas repetitivas, además de ser aburrido, no tiene mucho caso en nuestro día a día. En este post, veremos cómo crear scripts que automaticen procesos y cómo configurarlos para que se ejecuten en ciertos periodos de tiempo.
Casos de uso comunes de cron
La automatización en Bash tiene como razón de ser la creación de scripts que se ejecuten de manera autónoma y sin intervención de los usuarios. Entre las acciones más comunes están:
- Backups de archivos, directorios completos o bases de datos
- Revisiones de configuración
- Actualizaciones
- Envío o gestión de alertas
Ahora entraremos en detalle con cron
, que es la que nos ayudará con la programación de horas y fechas en las que se ejecutarán nuestros scripts.
¿Qué son los Cron jobs en Linux?
cron
es un proceso (daemon) que ejecuta comandos o scripts en intervalos regulares o en momentos específicos. La configuración está en un archivo llamado crontab
. Debemos aclarar que cada usuario del sistema tiene su propio crontab
, así que hay que tener cuidado, porque es muy común andar trasteando con root
y hacemos un desastre. Pero también existen crontabs
del sistema que afectarán a otros usuarios.
El daemon cron
está en funcionamiento continuo, verificando los archivos crontab
cada minuto para ver si hay alguna tarea pendiente de ejecutar.
Esto es mejor conocido como cron jobs
.
Sintaxis de Crontab
La sintaxis de cron jobs
en crontab consta de cinco “campos” que representan el momento en que se ejecutará el comando o script. Estos campos son seguidos por el comando a ejecutar:
* * * * * comando/a/ejecutar
| | | | |
| | | | ----- Día de la semana (0 - 7) (domingo = 0 o 7)
| | | ------- Mes (1 - 12)
| | --------- Día del mes (1 - 31)
| ----------- Hora (0 - 23)
------------- Minuto (0 - 59)
- Cada campo puede contener:
- Un número específico (por ejemplo,
5
para las 05:00). - Un asterisco (
*
) para indicar “cualquier valor”. - Listas separadas por comas (por ejemplo,
1,3,5
). - Rangos separados por guiones (por ejemplo,
1-5
). - Pasos de intervalo usando una barra inclinada (por ejemplo,
*/5
para cada 5 minutos).
- Un número específico (por ejemplo,
Nota: hay combinaciones que no son válidas.
Crear y editar cron jobs
Para crear o editar un cron job, se usa el siguiente comando:
crontab -e
Esto abrirá el editor predeterminado donde puedes agregar, editar o eliminar cron jobs
para el usuario actual.
Una vez que guardemos y ya exista contenido, por lo general se genera un archivo de respaldo en $HOME/.cache/crontab/crontab.bak
.
Ver los cron jobs existentes
Puedes verificar los cron jobs
del usuario actual con:
crontab -l
Cron con variables de entorno
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MI_MENSAJE="Este es un mensaje"
0 0 * * * /ruta/al/script.sh
Eliminar un cron job
Para eliminar un cron job específico, simplemente edita el archivo crontab con crontab -e
y borra la línea que lo contiene.
Si quieres eliminar todos los cron jobs
de un usuario:
crontab -r
El archivo de backup se queda guardado si por error la regaste.
Buenas prácticas al usar cron
Especificar rutas absolutas
Usa siempre rutas absolutas en tus
cron jobs
. Así evitarás problemas si el cron job no encuentra un ruta, el archivo o comando deseado:
0 0 * * * /usr/bin/python3 /home/usuario/proyecto/mi_script.py
En este ejemplo, le decimos exactamente el ejecutable de Python que ejecutará nuestro script en esta ruta específica.
Configurar correctamente PATH
Si te gusta el minimalismo y prefieres utilizar directamente los comandos, puedes usar la variable PATH
. cron
pueden usar un entorno diferente al de tu sesión normal, y algunas herramientas o scripts podrían no estar disponibles si el PATH
no está bien definido.
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 0 * * * mi_comando
Redirigir la salida a logs
¿Qué pasa si necesito enviar un archivo a otro servicio, por ejemplo enviar mi respaldo a AWS S3 y este nos marca un error? Si no registramos la salida de nuestro script no podremos estar seguros de qué fue lo que pasó.
Por ello es recomendable redirigir tanto la salida estándar como la salida de errores de tus cron jobs a archivos de log. Esto nos permitirá analizar y corregir los fallos.
0 0 * * * /ruta/al/script.sh >> /ruta/al/mi_log.log 2>&1
>>
: añadimos la salida estándar (stdout
) al archivo log.2>&1
: redirige los errores (stderr
) al mismo archivo.
Controlar permisos de usuario
No ejecutes cron jobs con permisos de root
a menos que sea absolutamente necesario. Usa cuentas con el mínimo privilegio necesario para evitar riesgos de seguridad. Además, asegúrate de configurar los permisos correctos para los scripts:
- Usa
chmod
para asegurarte de que solo el usuario adecuado tenga permisos de ejecución:
chmod 700 /ruta/al/script.sh
Periodos de cron útiles
Acá dejamos algunos formatos con periodos para ejecutar los cron jobs
en Linux muy comunes:
Cada minuto
* * * * * /ruta/al/script.sh
Se leería como: ejecútate cualquier minuto de cualquier hora, de cualquier día del mes, de cualquier mes, de cualquier día de la semana.
Cada 10 minutos
*/10 * * * * /ruta/al/script.sh
Se lee como: ejecútate cada 10 minutos, de cualquier hora, de cualquier día del mes, de cualquier mes, de cualquier día de la semana.
Cada hora
0 * * * * /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, de cualquier hora, de cualquier día del mes, de cualquier mes, de cualquier día de la semana.
Cada 12 horas
0 */12 * * * /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, cada 12 horas, de cualquier día del mes, de cualquier mes, de cualquier día de la semana.
Todos los días a las 12 de la noche
0 0 * * * /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, cuando sea la hora “0”, de cualquier día del mes, de cualquier mes, de cualquier día de la semana.
Todos los días a las 6 de la mañana
0 6 * * * /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, cuando sea la hora “6”, de cualquier día del mes, de cualquier mes, de cualquier día de la semana.
Todos los lunes a las 9 de la mañana
0 9 * * 1 /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, cuando sea la hora “9”, de cualquier día del mes, de cualquier mes, solo cuando sea el día “1” de la semana.
El primer día de cada mes a medianoche
0 0 1 * * /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, cuando sea la hora “0”, del primer día del mes, de cualquier mes, de cualquier día de la semana.
El primer lunes de cada mes a las 8 de la mañana
0 8 1-7 * 1 /ruta/al/script.sh
Se lee como: ejecútate cuando sea el minuto “0”, cuando sea la hora “8”, de los primeros 7 días del mes, de cualquier mes y que el día sea el “1” (lunes). O sea, le decimos que revise entre los primeros 7 días del mes (a fuerzas un día de ellos tiene que ser lunes).
Los siguientes los dejo sin comentarios. Tienes tarea.
Una vez al año, comenzando el 16 de septiembre
0 0 16 9 * /ruta/al/script.sh
Cada seis meses, comenzando el 16 de septiembre
0 0 16 9,3 * /ruta/al/script.sh
Cada tres meses, comenzando el 16 de septiembre
0 0 16 9,12,3,6 * /ruta/al/script.sh
Cada dos años, comenzando el 16 de septiembre
0 0 16 9 */2 /ruta/al/script.sh
Cada 15 minutos, pero solo entre las 9:00 AM y las 5:00 PM, de lunes a viernes
*/15 9-17 * * 1-5 /ruta/al/script.sh
Cada 15 minutos, pero solo entre las 9:00 AM y las 5:00 PM, de lunes, miércoles y viernes
*/15 9-17 * * 1,3,5 /ruta/al/script.sh
Pueden usar esta herramienta para probar.
Con esto terminamos de explicar los cron jobs en Linux.
¡Gracias por leer!