Conversor de Expresión Cron a Timer systemd
Herramienta gratuita para convertir una expresión cron (minuto hora día mes día de la semana) a la sintaxis OnCalendar= de los timers de systemd. Avisa sobre la semántica OR día-del-mes/día-de-semana, útil al migrar tareas cron a entornos Docker/Kubernetes.
Correspondencia entre campos de cron y componentes de systemd
Los 5 campos de una expresión cron corresponden a la sintaxis OnCalendar= de systemd de la siguiente manera.
| Posición | Campo cron | Equivalente en systemd |
|---|---|---|
| 1 | Minuto | Minuto de la parte horaria (MM en HH:MM:SS) |
| 2 | Hora | Hora de la parte horaria (HH en HH:MM:SS) |
| 3 | Día del mes | Día de la parte de fecha (día en año-mes-día) |
| 4 | Mes | Mes de la parte de fecha (mes en año-mes-día) |
| 5 | Día de la semana | Prefijo de día de la semana (p. ej. Mon, Mon..Fri) |
Como cron no tiene campo de segundos, el componente de segundos de systemd siempre es "00". Cuando el día del mes y el mes no están restringidos (*), la parte año-mes-día de systemd puede omitirse por completo.
Número de día de cron y abreviatura de día de systemd
Cron representa los días de la semana con números del 0 al 7, mientras que systemd usa abreviaturas en inglés.
| Número de día en cron | Abreviatura en systemd |
|---|---|
| 0 (7) | Sun |
| 1 | Mon |
| 2 | Tue |
| 3 | Wed |
| 4 | Thu |
| 5 | Fri |
| 6 | Sat |
Ejemplos comunes de conversión
| Expresión cron | OnCalendar= | Significado |
|---|---|---|
| * * * * * | OnCalendar=*-*-* *:*:00 | Se ejecuta cada minuto (equivalente a "* * * * *" en cron). |
| */15 * * * * | OnCalendar=*:00/15:00 | Se ejecuta cada 15 minutos. |
| 0 9 * * 1-5 | OnCalendar=Mon..Fri 09:00:00 | Se ejecuta a las 9:00 de lunes a viernes. |
| 0 0 1 * * | OnCalendar=*-*-01 00:00:00 | Se ejecuta a medianoche el día 1 de cada mes. |
| 0 0 1 1 * | OnCalendar=*-01-01 00:00:00 | Se ejecuta a medianoche el 1 de enero de cada año. |
| 0 0 1 * 1 | OnCalendar=Mon *-*-01 00:00:00 | Ejemplo con día del mes (día 1) y día de la semana (lunes) especificados a la vez. En cron esto es una condición OR (se ejecuta si coincide cualquiera de los dos), pero en systemd se convierte en una condición AND (solo se ejecuta si coinciden ambos), por lo que el resultado convertido se ejecuta con menos frecuencia que la expresión cron original. |
Una expresión cron que restringe tanto el día del mes como el día de la semana (ninguno es "*") no puede convertirse con precisión a la sintaxis OnCalendar de systemd, porque cron usa semántica OR en ese caso mientras que systemd siempre usa semántica AND. Considere dividir estos casos en dos timers systemd separados.
Consejos
- Si restringes tanto el día del mes como el día de la semana a algo distinto de "*", la condición OR de cron no puede representarse con exactitud mediante la condición AND de systemd. Revisa el aviso del resultado y considera dividirlo en dos timers si es necesario.
- Algunas imágenes base de contenedores mínimas (por ejemplo, imágenes Docker basadas en Alpine) no incluyen ningún demonio cron, lo que hace que los timers de systemd sean un reemplazo práctico al migrar tareas programadas.
- Puedes validar la línea OnCalendar generada con el comando "systemd-analyze calendar", que también muestra las próximas horas de ejecución programadas.
- A diferencia de una única línea de crontab, un timer de systemd consta de dos archivos: una unidad .timer (el horario) y una unidad .service (la tarea que se ejecuta realmente).
- Para horarios simples que no combinan día del mes y día de la semana (por hora, diario, semanal, etc.), esta conversión siempre es exacta.
Preguntas frecuentes
A propósito — De cron a los timers de systemd
systemd surgió alrededor de 2010 como un sistema de inicio para gestionar el arranque de Linux, y desde entonces se ha convertido en el estándar en la mayoría de las distribuciones. Su función de timers ofrece ejecución periódica de forma similar a cron, pero añade capacidades que cron nunca tuvo: resolución de dependencias, registro centralizado de ejecuciones mediante journalctl y un comportamiento de reintento configurable en caso de fallo.
Mientras tanto, entornos de contenedores como Docker y Kubernetes ofrecen cada vez más imágenes base sin ningún demonio cron, con el fin de mantener el tamaño de la imagen reducido. Cuando una tarea periódica necesita ejecutarse en tales entornos, las opciones prácticas son depender de un mecanismo a nivel de orquestador, como un CronJob de Kubernetes, o delegarlo en los timers de systemd si el propio host ejecuta systemd.
La sintaxis OnCalendar= es más expresiva que los 5 campos de cron, ya que admite precisión a nivel de año y de segundos, pero precisamente por esa mayor expresividad, algunas expresiones cron (las que restringen a la vez día del mes y día de la semana como condición OR) cambian de significado en una conversión ingenua. Esta herramienta muestra ese aviso de forma explícita para que las migraciones no tropiecen con una trampa fácil de pasar por alto.