Migrar tareas de cron a temporizadores de systemd mejora el registro, el control y la recuperación de ejecuciones perdidas, pero traducir la sintaxis a mano es propenso a errores. Esta herramienta valida su expresión cron, la explica en lenguaje natural, calcula las próximas cinco ejecuciones y genera los archivos .service y .timer listos para copiar.
También funciona a la inversa: pegue una expresión OnCalendar y obtenga el cron equivalente cuando sea posible.
Por qué migrar de cron a systemd timers
Cron lleva décadas programando tareas en Linux, pero systemd ofrece ventajas operativas claras: cada ejecución queda registrada en el journal con su código de salida, las unidades pueden declarar dependencias y límites de recursos, se puede consultar el estado con systemctl list-timers y existe Persistent=true para recuperar ejecuciones perdidas cuando el equipo estaba apagado. Esta herramienta convierte en ambos sentidos entre una expresión cron y los archivos .service y .timer equivalentes.
Anatomía de una expresión cron
Una línea de crontab tiene cinco campos que se leen de izquierda a derecha:
minuto(0-59),hora(0-23),día del mes(1-31),mes(1-12 o nombres) ydía de la semana(0-7 o nombres, donde 0 y 7 son domingo).- Operadores:
*(todos),,(lista),-(rango) y/(paso). Por ejemplo,*/15en minutos equivale a 0, 15, 30 y 45. - Macros:
@hourly,@daily,@weekly,@monthlyy@yearly.
Existe una regla poco conocida: cuando tanto el día del mes como el día de la semana están restringidos, cron ejecuta la tarea si coincide cualquiera de los dos (operación OR). Systemd, en cambio, exige que ambos coincidan. Por eso la herramienta genera dos líneas OnCalendar en ese caso.
Anatomía de OnCalendar
El formato de systemd es DíaSemana AAAA-MM-DD HH:MM:SS, donde cada componente admite *, listas con coma, rangos con .. y repeticiones con /. Los segundos se completan con :00 para emular la granularidad de un minuto de cron.
30 2 * * *se convierte en*-*-* 02:30:00.*/15 * * * *se convierte en*-*-* *:00/15:00.0 9 * * 1-5se convierte enMon..Fri *-*-* 09:00:00.0 4 1 * *se convierte en*-*-1 04:00:00.
Los dos archivos: servicio y temporizador
El archivo .service describe qué se ejecuta. Se declara como Type=oneshot porque la tarea arranca, termina y sale. Admite User=, WorkingDirectory= y ExecStart= con la ruta absoluta del ejecutable. El archivo .timer describe cuándo se ejecuta:
OnCalendar=: el calendario equivalente a la expresión cron.Persistent=true: guarda en disco la última activación y, si se perdió alguna mientras el equipo estaba apagado, la lanza al arrancar.AccuracySec=: margen de tolerancia para agrupar activaciones y ahorrar energía. El valor por defecto es 1 minuto; con1sla ejecución es casi exacta.Unit=y la sección[Install]conWantedBy=timers.target, para que el temporizador arranque con el sistema.
Diferencias de entorno que provocan fallos
- PATH mínimo: systemd no hereda el entorno de su shell. Use rutas absolutas en
ExecStart. - Sin shell por defecto: las tuberías, redirecciones y variables requieren
/bin/sh -c '...', que la herramienta añade automáticamente. - Caracteres especiales: en un archivo de unidad,
%y$tienen significado propio y se escapan como%%y$$. En crontab, un%sin escapar equivale a un salto de línea. - Sin correo: cron envía la salida por correo (MAILTO); systemd la guarda en el journal, que se consulta con
journalctl -u nombre.service.
Verificación recomendada
Antes de activar el temporizador, valide el calendario con systemd-analyze calendar "*-*-* 02:30:00", que muestra la forma normalizada y la próxima ejecución, y compruebe la sintaxis de las unidades con systemd-analyze verify. Tras activar, systemctl list-timers confirma cuándo se disparará la siguiente ejecución.
Casos de uso reales
- Copias de seguridad nocturnas con
Persistent=true, para que no se pierdan si el servidor estuvo apagado. - Rotación y limpieza de logs con ejecuciones de baja prioridad y
AccuracySecamplio. - Renovación de certificados y sincronizaciones con registro auditable en el journal.
- Auditorías de migración: convertir en bloque un crontab heredado y revisar qué tareas dependen de variables de entorno.
Zona horaria
Cron y systemd ejecutan según la zona horaria del servidor, salvo que se indique otra. La herramienta muestra las próximas cinco ejecuciones en la hora local de su navegador o en UTC para que pueda comprobar que el calendario coincide con lo esperado.