¿Cómo ejecutar un Cron Job solo una vez en un momento específico?

Publicado 17 de octubre de 2024

Problema: Ejecutar una tarea de Cron una sola vez en un momento específico

Las tareas de Cron generalmente se configuran para ejecutarse repetidamente en horarios programados. Sin embargo, a veces es necesario ejecutar una tarea solo una vez en un momento específico. Esto puede ser complicado al configurar cron para realizar una tarea única y específica en el tiempo sin repetirla.

Soluciones para ejecutar tareas de Cron una sola vez en un momento específico

Usar el comando 'at' para programación de una sola vez

El comando 'at' programa tareas de una sola vez. Puedes establecer un tiempo futuro para que se ejecute un comando. La sintaxis es:

echo "/ruta/al/comando opciones" | at [tiempo]

Para ejecutar un comando mañana:

echo "/usr/bin/mi_comando" | at now + 1 day

Consejo: Verificar tareas programadas

Usa el comando 'atq' para listar todas las tareas programadas. Esto te ayuda a confirmar que tu tarea se programó correctamente y ver su número de cola para posibles modificaciones o eliminaciones.

Tarea de Cron con script de autodesactivación

Si 'at' no está disponible, crea un script de autodesactivación:

  1. Configura una tarea de cron con un tiempo específico:

    0 0 2 12 * /ruta/a/tu_script.sh
  2. Crea un script que se ejecute solo una vez:

    #!/bin/bash
    
    SCRIPT="/ruta/a/tu_script.sh"
    MARCADOR="${SCRIPT}.hecho"
    
    if [ -f "$MARCADOR" ]; then
     exit 0
    fi
    
    # Tu tarea de una sola vez aquí
    echo "Tarea ejecutada" | mail -s "Tarea única completada" usuario@ejemplo.com
    
    touch "$MARCADOR"

Este script verifica si existe un archivo marcador y sale si existe, evitando múltiples ejecuciones.

Usar Cron con verificación de fecha

Otro método utiliza la verificación de fecha:

#!/bin/bash

FECHA_EJECUCION="2023-12-25"
FECHA_ACTUAL=$(date +%Y-%m-%d)

if [ "$FECHA_ACTUAL" != "$FECHA_EJECUCION" ]; then
  exit 0
fi

# Tu tarea de una sola vez aquí
echo "Tarea festiva ejecutada" | mail -s "Tarea festiva completada" usuario@ejemplo.com

Este script ejecuta la tarea solo en la fecha establecida, saliendo si la fecha actual no coincide.

Ejemplo: Agregar registro a tareas de Cron basadas en fecha

#!/bin/bash

FECHA_EJECUCION="2023-12-25"
FECHA_ACTUAL=$(date +%Y-%m-%d)
ARCHIVO_REGISTRO="/var/log/tarea_unica_cron.log"

if [ "$FECHA_ACTUAL" != "$FECHA_EJECUCION" ]; then
  echo "$(date): Script verificado, pero no ejecutado (fecha incorrecta)" >> "$ARCHIVO_REGISTRO"
  exit 0
fi

# Tu tarea de una sola vez aquí
echo "Tarea festiva ejecutada" | mail -s "Tarea festiva completada" usuario@ejemplo.com

echo "$(date): Tarea ejecutada exitosamente" >> "$ARCHIVO_REGISTRO"

Este ejemplo agrega registro para rastrear los intentos de ejecución del script y los éxitos, lo cual es útil para monitorear y solucionar problemas de tareas de cron de una sola vez.