Expresión 0 0 1 * *
La expresión cron 0 0 1 * * se ejecuta en el minuto 0 de la hora 0 del día 1 de cada mes, sin importar el mes o el ano. Esto significa que el trabajo se ejecuta a la medianoche del 1 de enero, 1 de febrero, 1 de marzo, etc., exactamente 12 veces al ano (una vez por cada mes calendario).
Desglose de campos:
| Campo | Valor | Significado |
|---|---|---|
| Minuto | 0 | Al inicio de la hora |
| Hora | 0 | Medianoche |
| Día del mes | 1 | Día 1 del mes |
| Mes | * | Cada mes |
| Día de la semana | * | Cualquier día |
Alias @monthly
@monthly es un atajo para 0 0 1 * * soportado por la mayoría de los servicios cron:
@monthly /opt/jobs/billing-cycle
# equivalente a:
0 0 1 * * /opt/jobs/billing-cycle
Casos Borde con Valores del Día del Mes
Meses con menos de 31 días
Si programas un trabajo para los días 29, 30 o 31, se omitira silenciosamente en los meses que no tienen esos días:
| Expresión | Meses omitidos |
|---|---|
0 0 29 * * | Febrero (la mayoría de los anos) |
0 0 30 * * | Febrero |
0 0 31 * * | Feb, Abr, Jun, Sep, Nov |
Ano bisiesto y 29 de febrero
0 0 29 * * omite febrero por completo en los anos no bisiestos. En anos bisiestos se ejecuta el 29 de febrero.
El Problema del Último Día del Mes
Cron no tiene sintaxis nativa para ‘el último día del mes’. El workaround práctico es ejecutar el trabajo a diario y verificar la fecha en el script:
#!/bin/bash
# Salir si mañana no es el día 1 (es decir, hoy es el último día del mes)
if [ "$(date -d tomorrow +%d)" != "01" ]; then
exit 0
fi
# lógica real del trabajo
Casos de Uso del Mundo Real
Facturación y corte de facturas
La generación de facturas, renovaciones de suscripciones o el recalculo de cargos basados en uso suele ocurrir en el limite del ciclo de facturación, el día 1 del mes.
Reportes mensuales
Los reportes financieros, de ventas y operativos a menudo recopilan datos del mes anterior.
Archivado de datos
Mover datos de más de un mes a almacenamiento en frio, archivar registros antiguos de bases de datos son usos naturales para cron mensual.