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.
Reescribir una expresión cron como temporizador de systemd
Trasladar una programación de `cron` a un temporizador de `systemd` supone traducir los cinco campos de minuto, hora, día del mes, mes y día de la semana a la sintaxis `OnCalendar=`. Introduzca una expresión cron y esta herramienta produce el `OnCalendar=` correspondiente, junto con advertencias sobre cuanto merezca cuidado.
**Lo más importante de esta traducción es cómo se comportan el día del mes y el día de la semana cuando se dan ambos.** Cron los lee como una **disyunción**: `0 0 1 * 1` significa "el primero del mes **o** cada lunes" y puede dispararse unas cinco veces al mes. **El `OnCalendar=` de systemd, en cambio, trata la misma especificación como una conjunción.** Pasa a significar "el primero **y** que sea lunes", y se dispara una o dos veces al año. **Una traducción mecánica altera, pues, la frecuencia con que corre la tarea, y lo hace en silencio.** Esta herramienta detecta esa combinación y se lo advierte.
Cómo convertir
- Introduzca la expresión cron Escriba los cinco campos —minuto, hora, día del mes, mes, día de la semana— separados por espacios.
- Revise el OnCalendar= generado Se le entrega la sintaxis de systemd correspondiente.
- Lea las advertencias **Allí donde se dan a la vez día del mes y día de la semana, se le señala el cambio de significado.**
- Transcríbalo a una unidad de temporizador Péguelo en la sección `[Timer]` de un archivo `.timer`.
Consejos para aprovecharla mejor
- 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.
Cuándo resulta útil
Trasladarse a un entorno de contenedores
**Los contenedores a menudo no llevan demonio cron, de modo que las programaciones han de pasar a temporizadores de systemd u otro arreglo.**
Querer constancia de lo que se ejecutó
Un temporizador de systemd deja su rastro en journald, que puede seguirse después.
Querer dependencias entre tareas
**Correr solo después de que otra unidad haya arrancado es algo que cron no sabe expresar.**
Hacer inventario de las programaciones existentes
Convertir un conjunto de expresiones cron a la vez le da ocasión de comprobar que los intervalos son los que quería.
Términos de los programadores
- Expresión cron
- La sintaxis que expresa una hora mediante cinco campos: minuto, hora, día del mes, mes y día de la semana. **El día del mes y el de la semana se leen como disyunción.**
- OnCalendar=
- La clave que indica la hora en un temporizador de systemd. **El día del mes y el de la semana se leen como conjunción.**
- Unidad de temporizador
- Un archivo con la extensión `.timer`, que arranca el `.service` del mismo nombre.
- Persistent=
- **El ajuste que hace que un temporizador se ponga al día tras el arranque si el sistema estaba apagado cuando debía dispararse.** Obra de manera parecida a `anacron` para cron.
- AccuracySec=
- La tolerancia sobre la hora de disparo. Por defecto rige un minuto de holgura, así que indíquela allí donde la hora deba ser exacta.
- Journald
- La recogida de registros de systemd. La salida de una tarea arrancada por un temporizador se guarda también aquí.
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.