lunes, 23 de marzo de 2026

Automatizacion con Python - Cap2 - parte 2

Capítulo 02 // Parte 2

Configurar un Trabajo Cron

Python Automation Cookbook — Programación de Tareas en Unix/Linux

Cron es una forma antigua pero confiable de ejecutar comandos. Ha existido desde la década de 1970 en Unix, y es un favorito de la vieja escuela en administración de sistemas para realizar tareas de mantenimiento como liberar espacio en disco, rotar archivos de registro, hacer copias de seguridad y otras operaciones comunes y repetitivas.

Esta receta es específica para sistemas operativos Unix y similares a Unix, por lo que funcionará en Linux y macOS. En Windows se usa el Task Scheduler, que no se cubrirá aquí.

ANÁLISIS_CRON

Ventajas y Desventajas

Ventajas

UNIVERSAL
Presente en prácticamente todos los sistemas Unix o Linux
FÁCIL DE USAR
Simple una vez que entiendes la sintaxis
BIEN CONOCIDO
Casi cualquier sysadmin sabe cómo usarlo
PRECISIÓN
Permite comandos periódicos con buena precisión

Desventajas

POCA RETROALIMENTACIÓN
Por defecto, puede no dar mucha información sobre errores
AUTOCONTENIDO
La tarea debe evitar problemas con variables de entorno
SOLO UNIX
No funciona en Windows
SIN CONTROL DE SUPERPOSICIÓN
No controla cuántas tareas se ejecutan al mismo tiempo
Ejecutar múltiples tareas costosas al mismo tiempo puede tener un mal efecto en el rendimiento. Tener tareas costosas superpuestas puede resultar en una condición de carrera donde cada tarea impide que las otras terminen. ¡Permite tiempo amplio para que tus tareas terminen!
PREPARACIÓN

Script para Cron

cron.py
import argparse
import sys
from datetime import datetime
import configparser

def main(number, other_number, output):
    result = number * other_number
    print(f'[{datetime.utcnow().isoformat()}] The result is {result}', 
          file=output)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--config', '-c', type=argparse.FileType('r'),
                        help='config file',
                        default='/etc/automate.ini')
    parser.add_argument('-o', dest='output', type=argparse.FileType('w'),
                        help='output file',
                        default=sys.stdout)
    
    args = parser.parse_args()
    
    if args.config:
        config = configparser.ConfigParser()
        config.read_file(args.config)
        args.n1 = int(config['ARGUMENTS']['n1'])
        args.n2 = int(config['ARGUMENTS']['n2'])
    
    main(args.n1, args.n2, args.output)
$ python3 cron.py -o /path/automate.log
[2020-01-15 22:28:08.833272] The result is 35
PASOS

Configurar el Cron Job

Paso 1: Obtener Ruta del Intérprete

$ which python
/your/path/.venv/bin/python

Paso 2: Probar el Comando Completo

TERMINAL
$ /your/path/.venv/bin/python /your/path/cron.py -o /path/automate.log
$ /your/path/.venv/bin/python /your/path/cron.py -o /path/automate.log

Paso 3: Editar Crontab

$ crontab -e
# Ejecutar cada 5 minutos
*/5 * * * * /your/path/.venv/bin/python /your/path/cron.py -o /path/automate.log

Paso 4: Verificar y Monitorear

$ tail -F /path/automate.log
[2020-01-17 21:20:00.611540] The result is 35
[2020-01-17 21:25:01.174835] The result is 35
[2020-01-17 21:30:00.886452] The result is 35
SINTAXIS

Formato Crontab

La línea del crontab consiste en seis elementos que describen cuándo ejecutar la tarea, seguidos del comando a ejecutar:

* * * * * *
| | | | | | 
| | | | | +-- Año (rango: 1900-3000)
| | | | +---- Día de la Semana (rango: 1-7, 1 = Lunes)
| | | +------ Mes del Año (rango: 1-12)
| | +-------- Día del Mes (rango: 1-31)
| +---------- Hora (rango: 0-23)
+------------ Minuto (rango: 0-59)

Ejemplos Comunes

Expresión Significado
30 15 * * * * Todos los días a las 15:30
30 * * * * * Cada hora, a los 30 minutos
0,30 * * * * * Cada hora, a los 0 y 30 minutos
*/30 * * * * * Cada media hora
0 0 * * 1 * Cada Lunes a las 00:00
*/5 * * * * * Cada 5 minutos
No intentes adivinar demasiado. Usa una hoja de trucos como crontab.guru para ejemplos y ajustes. La mayoría de los usos comunes se describirán allí directamente.
IMPORTANTE

Rutas Completas

La tarea debe describirse con todas las rutas completas para cada archivo relacionado:

  • ✦ El intérprete de Python
  • ✦ El script a ejecutar
  • ✦ El archivo de salida
Un error muy común es que cron no pueda determinar uno o más de estos tres elementos. Esto elimina toda ambigüedad relacionada con las rutas y reduce las posibilidades de errores.

Basado en "Python Automation Cookbook" // Jaime Buelta

Traducción al español — Capítulo 2, Parte 2 de 4