Cron frente a temporizadores systemd
| cron | temporizador systemd | |
|---|---|---|
| Definición | Una línea en un crontab | Dos archivos: .timer (cuándo) y .service (qué) |
| Ejecuciones perdidas | Se pierden (salvo con anacron) | Persistent=true las ejecuta en el siguiente arranque |
| Entorno | PATH mínimo, sin perfil; salida por correo | Definido en la unidad; salida al journal |
| Solapamiento | Se vuelve a ejecutar aunque la anterior siga en marcha | Nunca se solapa: un temporizador espera a que termine su servicio |
| Dependencias | Ninguna | After=network-online.target, montajes, otras unidades |
| Límites de recursos, sandboxing | No | Todo lo de systemd: MemoryMax, CPUQuota, ProtectSystem… |
| Inspección | crontab -l, grep en el syslog | systemctl list-timers, journalctl -u, systemctl status |
| Simplicidad | Una línea | Veinte líneas |
Para una línea en una máquina personal, cron está bien. Para cualquier cosa en un servidor que no deba solaparse, deba recuperarse tras una caída, necesite límites o cuyos registros alguien leerá después, un temporizador es la mejor herramienta, y el conversor escribe el código repetitivo.
Qué hace el conversor con el comando
ExecStart= toma una ruta absoluta y argumentos, no una línea de shell. Las redirecciones (>> log 2>&1) se eliminan porque el journal captura la salida; las tuberías y && se envuelven en /bin/sh -c '…'. La regla de cron de que % significa salto de línea no se aplica, así que date +%F funciona tal cual. Las variables de entorno fijadas en el crontab pasan a líneas Environment=.
Día del mes y día de la semana
Si una línea cron restringe ambos, cron se dispara cuando coincide cualquiera; systemd exige ambos. El conversor avisa, ya que esa planificación necesita dos temporizadores para reproducirse.
Preguntas
¿Dónde van los archivos?
/etc/systemd/system/ para unidades de sistema, ~/.config/systemd/user/ para unidades de usuario (luego usa systemctl --user y loginctl enable-linger). Ejecuta systemctl daemon-reload tras añadir o editar.
¿Cómo veo cuándo se ejecutará la próxima vez?
systemctl list-timers --all muestra la próxima y la última ejecución de cada temporizador. systemd-analyze calendar "expr" muestra la próxima ejecución de cualquier expresión OnCalendar.
¿Cómo lo ejecuto ahora, sin esperar?
systemctl start nombre.service (no el temporizador). El temporizador mantiene su propia planificación.
¿Puede un temporizador ejecutarse cada 10 segundos?
Sí, con OnCalendar=*:*:0/10 y AccuracySec=1s, o con OnUnitActiveSec=10s para «10 segundos después de que terminara la última ejecución». Cron no puede bajar de un minuto.