Automatización de tareas CLI Linux con Cron, crontab y cron job
Crontab es una herramienta de programación en Linux que te permite automatizar tareas. Esto significa que puedes configurar tu sistema para ejecutar ciertos comandos a intervalos regulares sin necesidad de intervención manual. Es un método útil para realizar tareas repetitivas, tales como copias de seguridad, actualizaciones o mantenimiento del sistema.
Thank you for reading this post, don't forget to subscribe!
Diferencia entre Cron, Crontab y Cron Job
Elemento | Nombre en Linux | Significado |
---|---|---|
Daemon | ‘crond’ | Son procesos del sistema del sistema Linux. |
Table | ‘crontab’ | Tabla en la que se introduce un comando crontab. Cada asterisco (*) representa un segmento de tiempo y una acción o tarea. |
Job | Cron Job | Tarea específica para realizar descrita en una fila, emparejada con su id de tiempo designado |
La tabla Cron
Se trata de un archivo del sistema Linux que crea una estructura tipo tabla en la que los campos están separados por espacios en blanco. Los usuarios pueden rellenar la tabla asignando valores a cada campo (asterisco).
El Daemon Cron
Un proceso del sistema llamado Daemon se ejecuta en nuestro sistema
El daemon cron se llama ‘crond’. No se requiere ninguna acción por nuestra parte para ejecutar ese Daemon,para testear si se esta ejecutando:
$ ps aux | grep crond
Este comando buscará los procesos actuales de todos los usuarios y devolverá cualquier instancia de ‘crond’.
$ ps ux | grep crond
$ username 15032 0.0 0.0 72948 892 pts/1 S+ 19:09 0:00 grep crond
Sintaxis de Crontab
crontab [opciones]
* * * * * <comando>
OR
* * * * * <path/del/script>

Como puedes ver, la sintaxis de crontab tiene 5 (*) asteriscos. Esto es lo que representa cada uno de esos asteriscos:
1 ^o^ | 2 ^o^ | 3 ^o^ | 4 ^o^ | 5 ^o^ | |
---|---|---|---|---|---|
* | * | * | * | * | |
ID | Minuto | Hora | Día | Mes | Nombre del día |
Valores | 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
Para programar una tarea, sustituye el asterisco correspondiente por el valor deseado.
Un crontab como el siguiente:
0 0 * * 0
Ejecuta el ‘commando’ a las 00:00 [medianoche] todos los domingos.
Configurar crontab para acceso a tu cuenta de usuario
Crontab es específico para cada usuario.
$ crontab -l
no crontab for username
$ crontab -e
no crontab for username - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/code
Choose 1-2 [1]: 1
Al ejecutar este comando, se puede ver que no existe ningún crontab en el sistema.
Como aún no he creado un crontab, cuando uso -e
para editar la tabla, me pide mi editor de texto preferido.
Si no tienes éxito, utiliza sudo
Si intentas el comando crontab -e pero no obtiene este resultado, es posible que no tenga los privilegios de usuario para crear la tabla. Si tienes acceso sudo, puedes usar este para establecer el crontab.
$ sudo crontab -e <nombre_del_usuario>
Tu sistema cargará automáticamente su crontab en el destino adecuado, que puede variar en función de la distribución, pero suele estar en un directorio como /var/spool/cron/crontabs. No intentes editar los archivos aquí.
¿Qué sucede si la tarea cron encuentra un error?
El comportamiento predeterminado es enviar la salida por correo electrónico. Esta función está diseñada para los administradores que pueden enviar automáticamente los registros a un correo electrónico «local» en el dominio de la red.
Puedes configurar esto tú mismo si tienes un servidor de correo. También hay maneras de automatizar la salida de correo electrónico a Gmail o servicios similares. Sin embargo, estos métodos están fuera del alcance de este artículo.
En su lugar, veremos dos formas comunes de evitar el error.
Enviar la salida a un archivo
Puedes designar un archivo para que este tipo de salida sea enviada y luego usar >>
para redirigir la salida.
El uso de >>
añadirá información a un archivo existente, mientras que un solo símbolo >
sobrescribirá el archivo. Esto es importante saberlo si quieres mantener un archivo de registro grande que actualice los registros con frecuencia. Ambos crearán automáticamente el archivo si no existe.
Ejemplo de Cron Job:
0 * * * * echo "Linux is Cool!" >> ~/crontab_log.txt
Utiliza/dev/null
Esto evitará la opción de correo electrónico, ya que esencialmente elimina los datos. El error estándar (‘2’) y la salida estándar (‘1’) se envían al archivo nulo.
0 0 * * * echo "¿Por qué me silencias cada noche a medianoche?" > /dev/null 2>&1
Ejemplos de Crontab: programación de comandos y scripts
Ejemplo:
Minuto | Hora | Día | Mes | Nombre del día | Comando |
---|---|---|---|---|---|
0 | * | * | * | * | echo “Linux is Cool!” >> ~/crontab_log.txt |
Si el valor de los minutos es «0», el comando se ejecutará cada hora, a la hora en punto.
Programación avanzada de trabajos
Puedes editar varios valores a la vez. Si lo desea, puedes sustituir los 5 asteriscos por especificaciones.
Minuto | Hora | Día | Mes | Nombre del día | Comando |
---|---|---|---|---|---|
*/5 | 3-6 | */5 | */2 | 0,6 | echo “Linux is Cool!” >> ~/crontab_log.txt |
Aquí vemos:
Campo | Valor | Significado |
---|---|---|
Day Name | 0,6 | Sábados y domingos |
Month | */2 | Cada mes que sea divisible por 2 meses (pares). |
Day Date | * | Cada fecha |
Hour | 3-6 | Entre 3 y6 AM |
Minutes | */5 | Cada 5 minutos |
Cada dos meses, los fines de semana, independientemente de la fecha, este comando se ejecutará cada 5 minutos entre las 3 am y las 6 am.
Script de automatización cron para hacer copias de seguridad de archivos
No se limita a bash, también puedes implementar un script que use Python o Perl si se quiere.
Objetivos:
- Los trabajos serán procesados a las 3 AM cada noche
- Hacer una copia de seguridad de la carpeta /Documentos en un archivo zip
- Generar un archivo de texto con una lista de todo lo que hay en el directorio
- Crear una carpeta de archivo que clone nuestra copia de seguridad y el archivo de texto en una subcarpeta con la fecha actual
nuestro_backup_script.sh
#! /bin/bash
FECHA=$(date +%d-%m-%Y)
# Fecha en formato DÍA##-MESO##-AÑO####
mkdir -p ~/archivo/$FECHA
# crear una carpeta para la fecha de hoy en el archivo, si el archivo no existe, hacer archivo
ls -al ~/Documentos > ~/archivo/$FECHA/contenido.txt
# crear un archivo de texto con el contenido de la carpeta de documentos
cd ~/ && tar -cpzf $FECHA.docs.backup.gz Documentos/*
# cambiar al directorio padre a la carpeta tar /Documentos
cp ~/$FECHA.docs.backup.gz ~/archivo/$FECHA/documents_archivo.gz
# se deja un archivo .gz en el directorio padre, se envía un clon a nuestro archivo bajo su fecha
$ ls
Desktop Descargas Music Pictures Public Videos
Documentos ENV nuestro_backup_script.sh projects Templates 'VirtualBox VMs'
$ bash nuestro_backup_script.sh
$ ls
DD-MM-YYYY.docs.backup.gz Documentos Music projects Videos
archivo Descargas nuestro_backup_script.sh Public 'VirtualBox VMs'
Desktop ENV Pictures Templates
$ ls archivo/25-11-2019/
contents.all_files.txt documents_archivo.gz
Todo lo que queda por hacer es convertir este script en una tarea cron.
$crontab -e
Y añade lo siguiente:
0 3 * * * bash ~/nuestro_backup_script.sh
Funciono?