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

  1. Introduzca la expresión cron Escriba los cinco campos —minuto, hora, día del mes, mes, día de la semana— separados por espacios.
  2. Revise el OnCalendar= generado Se le entrega la sintaxis de systemd correspondiente.
  3. 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.**
  4. 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

OnCalendar= tiene la forma "día_semana año-mes-día hora:minuto:segundo" (las partes de día de la semana y fecha son opcionales). "*" significa "cualquier valor", ".." indica un rango, "/" indica un intervalo y "," enumera varios valores. Por ejemplo, "Mon..Fri 09:00:00" significa exactamente las 9:00 de lunes a viernes.

Los timers de systemd ofrecen funciones que cron por sí solo no tiene: registros de ejecución centralizados a través de journalctl, espera a que se inicien los servicios de los que depende y reintentos automáticos configurables en caso de fallo. Además, cada vez más imágenes base de contenedores prescinden del demonio cron para ser más ligeras, por lo que en hosts basados en systemd, los timers se convierten en el reemplazo natural.

Según la semántica de Vixie cron, cuando tanto el día del mes como el día de la semana están restringidos (no son "*"), la tarea se ejecuta si coincide cualquiera de los dos, es decir, una condición OR. Sin embargo, la sintaxis OnCalendar de systemd siempre trata las partes de día de la semana y fecha como una condición AND (deben coincidir ambas). Esta herramienta detecta ese caso y muestra un aviso de que el resultado convertido puede ejecutarse con menos frecuencia que la expresión cron original.

Para horarios simples que no combinan día del mes y día de la semana, la conversión es exacta. Sin embargo, si aparece el aviso de semántica OR, la frecuencia real puede diferir de la prevista, por lo que recomendamos comprobar las próximas horas de ejecución con "systemd-analyze calendar" antes de desplegarlo en producción.

Una expresión cron estándar de 5 campos no tiene campo de segundos, por lo que el componente de segundos de la línea OnCalendar generada siempre es "00". La propia sintaxis OnCalendar de systemd sí admite especificar segundos, pero esta herramienta no lo usa al convertir desde cron.
Tool-kun

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.