Back to Blog

Automate on Ubuntu: cron and systemd timers with real examples

Complete tutorial on cron/systemd timers in Ubuntu. Learn crontab, OnCalendar, timer units.

Automate on Ubuntu: cron and systemd timers with real examples

Automate on Ubuntu: cron and systemd timers with real examples

Introducción

La automatización de tareas es un aspecto esencial en la administración de sistemas. En Ubuntu, hay dos herramientas principales que facilitan la programación de tareas: cron y systemd timers. Ambas herramientas permiten a los administradores ejecutar scripts y comandos automáticamente en momentos específicos o a intervalos regulares, lo que mejora la eficiencia y reduce la carga de trabajo manual.

Cron es un servicio clásico que permite programar tareas basadas en una tabla de configuración llamada crontab, mientras que systemd timers es una función más moderna que utiliza la infraestructura de systemd para programar tareas. Cada método tiene sus ventajas, y en este tutorial, exploraremos cómo utilizar ambos para automatizar tareas en Ubuntu. Incluiremos ejemplos prácticos que muestran cómo programar tareas comunes y cómo elegir la mejor opción según las necesidades del sistema.

Prerrequisitos

  • Versión de Ubuntu: Este tutorial se basa en Ubuntu 20.04 LTS o superior.
  • Permisos: Necesitarás permisos de superusuario (root) para algunas de las configuraciones.
  • Conocimientos básicos: Familiaridad con la línea de comandos de Linux.

Conceptos clave

  • Cron: Un servicio de Unix que permite programar tareas periódicas utilizando el archivo crontab.
  • Crontab: Un archivo que contiene las instrucciones para cron sobre cuándo y qué ejecutar.
  • Systemd: Un sistema de inicio y gestión de servicios en Linux, que incluye timers para programar tareas.
  • Timer Units: Archivos de configuración utilizados por systemd para programar tareas, que se componen de un archivo de timer y un archivo de servicio asociado.

Sintaxis/Comandos

Cron

Comando Descripción
crontab -e Edita el archivo crontab del usuario actual.
crontab -l Lista las tareas programadas del usuario actual.
crontab -r Elimina el archivo crontab del usuario actual.
cron.d Directorio donde se pueden colocar archivos crontab.

Systemd Timers

Comando Descripción
systemctl list-timers Lista los timers activos en el sistema.
systemctl start <timer> Inicia un timer específico.
systemctl stop <timer> Detiene un timer específico.
systemctl enable <timer> Habilita un timer para que se inicie al arrancar.

Ejemplos prácticos

1. Programar una tarea con cron

Supongamos que deseas hacer una copia de seguridad de un directorio específico cada día a las 2 a.m. Edita el crontab:

crontab -e
# Comentario: Abre el archivo crontab en el editor.

Agrega la siguiente línea al archivo:

0 2 * * * /usr/bin/tar -czf /home/user/backup/home_$(date +\%Y\%m\%d).tar.gz /home/user/
# Comentario: Crea un archivo tar comprimido de la carpeta /home/user/ a las 2 a.m. todos los días.

2. Programar una tarea cada 15 minutos

Para ejecutar un script que limpia archivos temporales cada 15 minutos, agrega la siguiente línea al crontab:

*/15 * * * * /usr/local/bin/clean_temp.sh
# Comentario: Ejecuta el script clean_temp.sh cada 15 minutos.

3. Usar cron para ejecutar un comando al reiniciar

Si deseas ejecutar un comando específico cada vez que el sistema se reinicie, puedes usar:

@reboot /usr/local/bin/startup_script.sh
# Comentario: Ejecuta el script startup_script.sh al reiniciar el sistema.

4. Programar una tarea con Systemd Timers

Ahora, veamos cómo programar una tarea utilizando systemd timers. Primero, crea un archivo de servicio que defina la tarea que deseas realizar. Crea un archivo llamado /etc/systemd/system/my_backup.service con el siguiente contenido:

[Unit]
Description=Backup Home Directory

[Service]
Type=oneshot
ExecStart=/usr/bin/tar -czf /home/user/backup/home_$(date +%Y%m%d).tar.gz /home/user/
# Comentario: Servicio para crear un backup del directorio home.

5. Crear un timer para el servicio

Ahora, crea un archivo de timer llamado /etc/systemd/system/my_backup.timer:

[Unit]
Description=Run my_backup.service daily

[Timer]
OnCalendar=*-*-* 02:00:00
Unit=my_backup.service

[Install]
WantedBy=timers.target
# Comentario: Timer que ejecuta el servicio a las 2 a.m. todos los días.

6. Habilitar y empezar el timer

Habilita y empieza el timer con los siguientes comandos:

sudo systemctl enable my_backup.timer
sudo systemctl start my_backup.timer
# Comentario: Habilita el timer para que se inicie al arrancar y lo inicia inmediatamente.

7. Verificar el estado de los timers

Puedes verificar el estado de los timers activos en el sistema con:

systemctl list-timers
# Comentario: Muestra una lista de los timers activos y el próximo tiempo de ejecución.

8. Verificar logs de ejecución

Para verificar los registros de ejecución de tu servicio, usa el comando:

journalctl -u my_backup.service
# Comentario: Muestra los logs del servicio de backup.

Casos reales

Caso 1: Monitoreo del sistema

Supongamos que deseas monitorear el uso del disco y registrar el uso en un archivo cada hora. Puedes crear un script llamado disk_usage.sh y programarlo con cron:

#!/bin/bash
df -h >> /var/log/disk_usage.log
# Comentario: Registra el uso del disco en un archivo de log.

En el crontab agrega:

0 * * * * /path/to/disk_usage.sh
# Comentario: Registra el uso del disco cada hora.

Caso 2: Actualización de paquetes

Puedes programar una tarea que actualice los paquetes del sistema cada semana. Crea un script llamado update_packages.sh:

#!/bin/bash
apt update && apt upgrade -y
# Comentario: Actualiza los paquetes del sistema.

Y en el crontab:

0 3 * * 0 /path/to/update_packages.sh
# Comentario: Ejecuta el script todos los domingos a las 3 a.m.

Caso 3: Tareas de limpieza

Utiliza un timer de systemd para eliminar archivos temporales viejos cada semana. Crea un servicio y un timer como se describió anteriormente, pero ajusta el OnCalendar para que se ejecute cada semana.

[Timer]
OnCalendar=weekly
# Comentario: Ejecuta el servicio semanalmente.

Buenas prácticas

  1. Documentar tareas programadas: Mantén un registro de todas las tareas programadas y su propósito para facilitar la administración.
  2. Revisar logs regularmente: Monitorea los registros de ejecución para asegurarte de que las tareas se estén ejecutando correctamente.
  3. Probar scripts manualmente: Asegúrate de que los scripts funcionen correctamente al ejecutarlos manualmente antes de programarlos.
  4. Usar variables de entorno: Para scripts más complejos, utiliza variables de entorno para manejar configuraciones específicas.
  5. Separar scripts y configuraciones: Mantén los scripts y las configuraciones de cron/systemd en directorios separados para una mejor organización.

Errores comunes

  1. Error: Permission denied.

    • Causa: El script no tiene permisos de ejecución.
    • Solución: Asegúrate de que el script tenga permisos de ejecución con chmod +x /path/to/script.sh.
  2. Error: Command not found.

    • Causa: El comando no está en la variable PATH.
    • Solución: Usa rutas absolutas para los comandos en el script o agrega el directorio a la variable PATH.
  3. Error: Failed to start service.

    • Causa: Hay un error en el archivo de servicio.
    • Solución: Verifica el archivo de servicio y asegúrate de que no haya errores de sintaxis.
  4. Error: No such file or directory.

    • Causa: La ruta al archivo o script es incorrecta.
    • Solución: Verifica que la ruta especificada en el crontab o en el archivo de servicio sea correcta.

Comandos relacionados

Comando Descripción
at Programa tareas de una sola vez.
batch Programa tareas para ejecutarse cuando el sistema esté menos cargado.
systemctl Controla los servicios y timers de systemd.
date Muestra o establece la fecha y hora del sistema.
sh Ejecuta un script de shell.

Script de automatización

Aquí tienes un script de bash que automatiza la creación de un timer y un servicio en systemd:

#!/bin/bash

# Script para crear un servicio y un timer en systemd

# Variables
SERVICE_NAME="my_daily_script"
SCRIPT_PATH="/usr/local/bin/my_daily_script.sh"
TIMER_PATH="/etc/systemd/system/${SERVICE_NAME}.timer"
SERVICE_PATH="/etc/systemd/system/${SERVICE_NAME}.service"

# Crear script
echo "#!/bin/bash" | sudo tee $SCRIPT_PATH
echo "echo \"Running daily script at \$(date)\" >> /var/log/my_daily_script.log" | sudo tee -a $SCRIPT_PATH
sudo chmod +x $SCRIPT_PATH

# Crear archivo de servicio
echo "[Unit]" | sudo tee $SERVICE_PATH
echo "Description=My Daily Script" | sudo tee -a $SERVICE_PATH
echo "[Service]" | sudo tee -a $SERVICE_PATH
echo "Type=oneshot" | sudo tee -a $SERVICE_PATH
echo "ExecStart=$SCRIPT_PATH" | sudo tee -a $SERVICE_PATH

# Crear archivo de timer
echo "[Unit]" | sudo tee $TIMER_PATH
echo "Description=Runs My Daily Script every day" | sudo tee -a $TIMER_PATH
echo "[Timer]" | sudo tee -a $TIMER_PATH
echo "OnCalendar=daily" | sudo tee -a $TIMER_PATH
echo "[Install]" | sudo tee -a $TIMER_PATH
echo "WantedBy=timers.target" | sudo tee -a $TIMER_PATH

# Habilitar y iniciar el timer
sudo systemctl enable ${SERVICE_NAME}.timer
sudo systemctl start ${SERVICE_NAME}.timer

# Fin del script
echo "Servicio y timer creados para ejecutar $SCRIPT_PATH diariamente."

Conclusión

La automatización de tareas con cron y systemd timers en Ubuntu es una habilidad esencial para cualquier administrador de sistemas. En este tutorial, hemos explorado cómo usar ambas herramientas para programar tareas, proporcionando ejemplos prácticos y casos reales para ayudarte a implementar y gestionar tareas programadas en tu sistema. Con estas herramientas, puedes mejorar la eficiencia de tu administración del sistema y reducir la intervención manual en tareas repetitivas.

Los siguientes pasos incluyen la práctica de la programación de tareas en un entorno de prueba y la exploración de configuraciones más avanzadas, como la gestión de dependencias entre tareas.

Referencias

¡Ahora estás listo para automatizar tareas en tu sistema Ubuntu con cron y systemd timers! 🚀💡