Tutorial

cron vs systemd timers: automatizar su VPS Linux

Automatización7 min de lectura9 pasos

En un VPS Linux, la automatización no es un lujo: copias de seguridad nocturnas, renovación de certificados TLS, purga de logs, sondas de salud — esas tareas se ejecutan sin usted o no se ejecutan. Cron reina desde hace décadas, pero los systemd timers ofrecen una integración más profunda con el gestor de servicios. Esta guía compara ambas herramientas, describe cuándo elegir una u otra y le acompaña paso a paso para crear o migrar un timer de systemd.

Contenido· ¿Por qué automatizar las tareas en un VPS?1/11
  1. 01¿Por qué automatizar las tareas en un VPS?
  2. 02Casos de uso típicos en un VPS
  3. 03cron: recordatorio rápido
  4. 04systemd timers: introducción
  5. 05cron vs systemd timers: tabla comparativa
  6. 06¿Cuándo conservar cron?
  7. 07¿Cuándo pasar a los systemd timers?
  8. 08Crear un timer de systemd desde cero (ejemplo: copia de seguridad diaria)
  9. 09Migrar una tarea cron existente a systemd
  10. 10Problemas frecuentes con los timers de systemd
  11. 11Conclusión

¿Por qué automatizar las tareas en un VPS?

Un VPS es un servidor que funciona de forma continua, a menudo sin supervisión humana directa. Precisamente por eso la automatización de las tareas recurrentes es fundamental: nadie estará ahí a las 3 de la madrugada para lanzar la copia de seguridad o renovar el certificado Let's Encrypt. Una tarea olvidada puede traducirse en una pérdida de datos, en un certificado caducado que deja el sitio fuera de línea o en un disco saturado por falta de rotación de logs. Las dos grandes herramientas disponibles en Linux —cron y los systemd timers— permiten planificar estas operaciones de forma fiable. Antes de elegir, conviene entender qué aporta realmente cada una.

Casos de uso típicos en un VPS

  • Copias de seguridad — dump de MySQL o PostgreSQL, archivado de ficheros hacia un almacenamiento remoto
  • Renovación de certificados TLScertbot renew o acme.sh --cron planificados dos veces al día
  • Rotación y purga de logs — borrado de los ficheros de más de 30 días, compresión semanal
  • Sondas de salud — comprobación de que un servicio escucha, reinicio automático si hace falta
  • Sincronización de datosrsync hacia un segundo nodo, actualización de cachés
  • Limpieza de entornos — borrado de sesiones caducadas, vaciado de directorios temporales

cron: recordatorio rápido

Cron está presente en casi todos los sistemas Linux. Para planificar una tarea se edita la crontab del usuario actual con crontab -e. La sintaxis se basa en cinco campos separados por espacios: minuto, hora, día del mes, mes y día de la semana, seguidos del comando. Por ejemplo, 0 3 * * * /usr/local/bin/backup.sh ejecuta el script todos los días a las 3. Los ficheros depositados en /etc/cron.d/ pertenecen al sistema y pueden indicar el usuario de ejecución directamente en la línea. La salida estándar y la de error se envían por correo al usuario —algo que en la práctica se suele ignorar— o se redirigen manualmente a un fichero. Cron no conserva ningún historial nativo de las ejecuciones pasadas y no gestiona las tareas perdidas si la máquina estaba apagada.

systemd timers: introducción

Un timer de systemd es una pareja de dos ficheros de unidad: un fichero .service que describe qué ejecutar y un fichero .timer que describe cuándo lanzarlo. El timer se activa con systemctl enable --now monservice.timer y lo gobierna el gestor de servicios, exactamente igual que cualquier otro servicio de systemd. La directiva OnCalendar= acepta una sintaxis rica: daily, Mon *-*-* 03:00:00, *:0/15 (cada 15 minutos). También se pueden usar OnBootSec= y OnUnitActiveSec= para retardos relativos al arranque o a la última ejecución. Todas las salidas pasan por journald y se pueden consultar con journalctl -u monservice.service. El comando systemctl list-timers muestra la lista de todos los timers activos, su próximo vencimiento y la fecha de su última activación.

cron vs systemd timers: tabla comparativa

Desplace la tabla

Criteriocronsystemd timer
Sintaxis de planificación5 campos `* * * * *``OnCalendar=` legible (`daily`, `Mon 03:00`)
LogsSalida por correo o redirección manualjournald nativo, `journalctl -u`
Tareas perdidas (máquina apagada)Perdidas (salvo `anacron`)Persistent=true las reproduce tras reiniciar
Dependencias entre serviciosNinguna`After=`, `Requires=`, `Wants=`
Aislamiento y recursosHereda el entorno del shellCgroups, `MemoryMax=`, `CPUQuota=`
Ejecución como un usuario concretoCampo user en `/etc/cron.d/``User=` y `Group=` en el `.service`
DepuraciónDifícil sin logs`systemctl status`, `journalctl -xe`
DisponibilidadTodos los sistemas UnixSistemas con systemd (Debian, Ubuntu, RHEL…)

¿Cuándo conservar cron?

Cron sigue siendo la buena elección en varias situaciones. En sistemas antiguos o minimalistas sin systemd —algunos contenedores, BSD, imágenes Alpine— cron suele ser la única herramienta disponible. En un entorno multiusuario donde cada usuario gestiona sus propias tareas con crontab -e, cron es más sencillo de delegar sin conceder permisos de root. Para scripts muy simples de una sola línea, la crontab sigue siendo legible y mantenible sin crear dos ficheros de unidad. Por último, si su equipo está familiarizado con cron y las tareas funcionan sin problemas desde hace años, la migración no aporta necesariamente valor inmediato. El criterio decisivo es la necesidad de logs, de dependencias o de recursos acotados.

¿Cuándo pasar a los systemd timers?

Los timers de systemd se imponen en cuanto la tarea supera el marco de un simple comando aislado. ¿Necesita journald para trazar cada ejecución, sus salidas y su código de retorno sin fontanería manual? Systemd timers. ¿Su script de copia de seguridad debe ejecutarse solo después de que PostgreSQL esté listo (After=postgresql.service)? Systemd timers. ¿Quiere limitar la memoria de un trabajo de sincronización para que no ahogue a los demás procesos (MemoryMax=512M)? Systemd timers. Y si el servidor se reinicia a las 2:58 cuando la copia de seguridad de las 3 tendría que haberse ejecutado, Persistent=true garantiza que se ejecutará en el siguiente arranque.

Crear un timer de systemd desde cero (ejemplo: copia de seguridad diaria)

  1. Crear el fichero service

    Abra /etc/systemd/system/backup.service e introduzca: [Unit], Description=Copia de seguridad diaria de PostgreSQL, After=postgresql.service, luego [Service], Type=oneshot, User=postgres, ExecStart=/usr/local/bin/backup.sh. El tipo oneshot indica que el servicio termina una vez ejecutado el script.

  2. Crear el fichero timer

    Cree /etc/systemd/system/backup.timer con: [Unit], Description=Disparador diario de la copia de seguridad, luego [Timer], OnCalendar=*-*-* 03:00:00, Persistent=true, y [Install], WantedBy=timers.target.

  3. Recargar systemd y activar el timer

    Ejecute systemctl daemon-reload para que systemd tenga en cuenta los nuevos ficheros, y luego systemctl enable --now backup.timer para activar e iniciar el timer de inmediato.

  4. Comprobar el timer

    Escriba systemctl list-timers --all para ver su timer con su próxima y su última fecha de ejecución. Utilice systemctl status backup.timer para el estado del timer, y systemctl status backup.service para el resultado de la última ejecución.

  5. Consultar los logs

    Acceda a todas las salidas del servicio con journalctl -u backup.service para el historial completo, o journalctl -u backup.service -n 50 --since today para las 50 últimas líneas del día.

Migrar una tarea cron existente a systemd

  1. Identificar la tarea cron que migrar

    Liste sus crontabs con crontab -l (usuario actual) y cat /etc/cron.d/* (sistema). Anote el comando exacto, el usuario de ejecución y la planificación en cinco campos. Por ejemplo: 30 2 * * 1 root /usr/bin/certbot renew --quiet significa cada lunes a las 2:30 como root.

  2. Traducir la planificación a OnCalendar

    El formato OnCalendar= de systemd se escribe DayOfWeek Year-Month-Day Hour:Minute:Second. 30 2 * * 1 se convierte en Mon *-*-* 02:30:00. Para probar la traducción, utilice systemd-analyze calendar 'Mon *-*-* 02:30:00', que muestra las 10 próximas ocurrencias calculadas.

  3. Crear los ficheros .service y .timer

    Cree /etc/systemd/system/certbot-renew.service con Type=oneshot, ExecStart=/usr/bin/certbot renew --quiet y User=root. Cree después /etc/systemd/system/certbot-renew.timer con OnCalendar=Mon *-*-* 02:30:00 y Persistent=true. Ejecute systemctl daemon-reload && systemctl enable --now certbot-renew.timer.

  4. Desactivar la línea cron y validar

    Comente o borre la línea en la crontab original. Pruebe de inmediato con systemctl start certbot-renew.service y consulte el resultado con journalctl -u certbot-renew.service -n 20. Compruebe que el timer aparece efectivamente en systemctl list-timers.

Para una tarea que debe ejecutarse unos minutos después del arranque y luego con regularidad, combine OnBootSec=5min y OnUnitActiveSec=1h en el bloque [Timer]. El trabajo arranca 5 minutos después del boot y, a partir de ahí, cada hora, sin depender de una hora de reloj fija.

Problemas frecuentes con los timers de systemd

Tres problemas se repiten al poner en marcha los timers. Primer caso: el timer está activo pero nunca se dispara. Compruebe con systemctl list-timers que la columna NEXT muestra una fecha coherente, y que systemctl status backup.timer indica active (waiting). Un daemon-reload olvidado tras modificar un fichero de unidad es la causa número uno. Segundo caso: el servicio falla en silencio. Consulte journalctl -u monservice.service -n 50: allí están completos el código de retorno y la salida de error. Compruebe que la ruta de ExecStart= es absoluta. Tercer caso: la tarea no recupera las ejecuciones perdidas. Asegúrese de que Persistent=true está presente en el bloque [Timer].

Conclusión

Cron y los systemd timers conviven sin problema en el mismo servidor: no tiene que migrarlo todo de golpe. Conserve cron para sus tareas sencillas y sus scripts de usuario existentes, y adopte los timers de systemd para las nuevas automatizaciones que se benefician de los logs de journald, de las dependencias entre servicios o del aislamiento por cgroups. Los comandos systemd-analyze calendar y systemctl list-timers son sus mejores aliados para validar y supervisar sus planificaciones.

Un VPS Linux listo para sus automatizaciones

Nuestros VPS cloud con Ubuntu y Debian incluyen systemd, journald y toda la pila moderna. Despliegue sus timers, scripts y copias de seguridad sobre una infraestructura fiable, con acceso root completo y soporte ágil.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva