Convertidor de temporizador systemd a expresión Cron

Convierte la sintaxis OnCalendar= de un temporizador systemd a una expresión cron (minuto hora día mes día de la semana) gratis. El inverso de nuestro convertidor "Cron a temporizador systemd". Admite atajos con nombre (daily, weekly, etc.) y avisa de diferencias semánticas cuando se especifican a la vez día del mes y día de la semana.

Correspondencia entre componentes de systemd y campos de cron

Cada parte de la sintaxis OnCalendar= de systemd corresponde a uno de los cinco campos de cron de la siguiente manera.

Posición Dónde aparece en systemd Campo de cron
1 Minuto en la parte de hora (MM en HH:MM:SS) Minuto
2 Hora en la parte de hora (HH en HH:MM:SS) Hora
3 Día en la parte de fecha (día en año-mes-día) Día del mes
4 Mes en la parte de fecha (mes en año-mes-día) Mes
5 Prefijo de día de la semana (p. ej. Mon, Mon..Fri) Día de la semana

El campo de segundos de systemd (SS en HH:MM:SS) no tiene equivalente en cron, así que se ignora durante la conversión (aparece un aviso si los segundos no son "00").

Correspondencia entre abreviaturas de día de systemd y números de día de la semana de cron

systemd usa abreviaturas en inglés para los días de la semana, mientras que cron usa números del 0 al 6.

Abreviatura de día de systemd Número de día de la semana en cron
Sun 0
Mon 1
Tue 2
Wed 3
Thu 4
Fri 5
Sat 6

Correspondencia entre atajos con nombre de systemd y expresiones cron

systemd tiene atajos con nombre legibles como "daily" y "weekly", y esta herramienta también puede convertirlos a expresiones cron.

OnCalendar= Expresión cron
minutely * * * * *
hourly 0 * * * *
daily / midnight 0 0 * * *
weekly 0 0 * * 1
monthly 0 0 1 * *
yearly / annually 0 0 1 1 *

Ejemplos de conversión comunes

OnCalendar= Expresión cron Significado
*-*-* *:*:00 * * * * * Se ejecuta cada minuto (equivalente a "* * * * *" en cron).
*:00/15:00 */15 * * * * Se ejecuta cada 15 minutos.
Mon..Fri 09:00:00 0 9 * * 1-5 Se ejecuta a las 9:00 los días laborables (de lunes a viernes).
*-*-01 00:00:00 0 0 1 * * Se ejecuta a medianoche el día 1 de cada mes.
*-01-01 00:00:00 0 0 1 1 * Se ejecuta a medianoche el 1 de enero de cada año.
Mon *-*-01 00:00:00 0 0 1 * 1 Un ejemplo que especifica tanto un día del mes (el 1) como un día de la semana (lunes). systemd lo trata como una condición AND (solo se ejecuta cuando ambos coinciden), pero cron lo interpreta como una condición OR (se ejecuta cuando coincide cualquiera de los dos) — así que el resultado convertido se ejecuta con más frecuencia de lo previsto en la expresión OnCalendar original.

Una expresión OnCalendar que restringe tanto el día del mes como el día de la semana a algo distinto de "*" no puede convertirse con precisión a cron (systemd usa lógica AND, cron usa lógica OR). Verifica siempre el significado del resultado de la conversión en casos como este.

Consejos de uso

  • Puedes escribir directamente atajos con nombre como "daily", "weekly" o "monthly" — se convierten internamente a la expresión cron equivalente (por ejemplo, "daily" se convierte en "0 0 * * *").
  • Restringir tanto el día del mes como el día de la semana a algo distinto de "*" cambia el significado al convertir la lógica AND de systemd en la lógica OR de cron. Comprueba el aviso en ese caso y confirma que el resultado coincide con tu intención.
  • Los campos de año y segundos de OnCalendar no tienen equivalente en cron, así que se descartan durante la conversión (un aviso te lo notifica cuando ocurre).
  • Útil al migrar cargas de trabajo fuera de systemd — por ejemplo, al mover una tarea programada a un Kubernetes CronJob (que usa sintaxis de estilo cron).
  • Para programaciones simples que no combinan restricciones de día de la semana y fecha (cada hora, cada día, cada semana, etc.), esta conversión siempre es exacta.

Preguntas frecuentes

Esto surge al migrar a un contenedor Docker ligero que no tiene systemd, al reproducir la misma programación en un Kubernetes CronJob (que usa sintaxis de estilo cron), o cuando las herramientas de tu equipo solo admiten configuración en formato cron.

Sí. Escribir atajos con nombre de systemd como "minutely", "hourly", "daily", "weekly", "monthly" o "yearly" directamente los convierte a la expresión cron equivalente.

En la sintaxis OnCalendar de systemd, una restricción de día de la semana y una restricción de fecha siempre se combinan con lógica AND (ambas deben coincidir). Sin embargo, según la semántica clásica de Vixie cron, restringir tanto el día del mes como el día de la semana a algo distinto de "*" las convierte en una condición OR (basta con que coincida una de las dos). Esta herramienta detecta ese caso y muestra un aviso de que el resultado convertido puede ser más amplio (ejecutarse con más frecuencia) que la expresión OnCalendar original.

Las expresiones cron no tienen campo para el año, así que cualquier restricción de año en una expresión OnCalendar (cualquier valor distinto de "*") se ignora durante la conversión. Esta herramienta muestra un aviso en ese caso, señalando que el resultado convertido se ejecuta todos los años, independientemente del año que especificaste.

La herramienta cubre los patrones principales que genera nuestra herramienta "Cron a temporizador systemd" (por minuto, cada hora, diario, semanal, mensual, anual, pasos, rangos, listas, restricciones de día de la semana y atajos con nombre). Sin embargo, como la sintaxis OnCalendar es más expresiva que cron, especificaciones muy complejas — varios años, repeticiones de precisión de segundos — no se pueden representar con exactitud en cron y pueden fallar al convertirse.
ツールくん

A propósito — Qué significa devolver un temporizador systemd a cron

Las migraciones tecnológicas suelen plantearse como algo unidireccional — pasar de un mecanismo antiguo a uno más nuevo —, pero en la práctica la conversión inversa también aparece con frecuencia. Mover una carga de trabajo de un host basado en systemd a un contenedor ligero que solo admite cron, o a una herramienta de orquestación que usa sintaxis de programación estilo cron (como Kubernetes CronJob), implica convertir la sintaxis OnCalendar de vuelta a una expresión cron.

Esta "conversión inversa" no es una simple correspondencia uno a uno, porque la sintaxis OnCalendar de systemd es más expresiva que cron. Admite conceptos que los cinco campos de cron simplemente no pueden representar — restricciones a nivel de año, precisión de segundos y una combinación de tipo AND entre fecha y día de la semana. Por eso esta herramienta busca convertir con precisión los patrones de uso común, y trata cualquier cosa más compleja como un error de conversión en lugar de intentar una aproximación.

La diferencia semántica cuando se especifican tanto el día del mes como el día de la semana — lógica AND en systemd frente a lógica OR en cron — es la mayor trampa de esta conversión inversa. Una condición como "el día 1 del mes" Y "lunes" limita systemd solo a los días que son a la vez el día 1 y lunes, pero cron se ejecutaría en cualquier día que sea el día 1 o lunes. Esta herramienta lo advierte explícitamente para que este cambio de significado, fácil de pasar por alto, no se escape durante una migración.