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

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.
ツールくん

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.