[{"data":1,"prerenderedAt":197},["ShallowReactive",2],{"seo-verification":3,"blog-cron-vs-systemd-timers-automatizar-vps-linux-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-cron-vs-systemd-timers-automatizar-vps-linux-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":143,"ctaBody":144,"ctaButton":145,"ctaUrl":146,"relatedPosts":147},230,"cron-vs-systemd-timers-automatizar-vps-linux",{"fr":12,"en":13,"ar":14,"es":10},"cron-systemd-timers-automatisation-vps","cron-vs-systemd-timers-automate-your-linux-vps","cron-مقابل-systemd-timers-أتمتة-vps-linux","cron vs systemd timers: automatizar su VPS Linux","Comparativa práctica de cron y systemd timers: sintaxis, logs, migración y solución de problemas para sus tareas recurrentes en un VPS Linux.",7,1,false,"2026-08-06T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fcron-systemd-timers-automatisation-vps-poster.svg","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.",[34,38,48,51,54,94,97,100,119,134,137,140],{"type":35,"title":36,"body":37},"h2","¿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.",{"type":39,"title":40,"items":41},"ul","Casos de uso típicos en un VPS",[42,43,44,45,46,47],"**Copias de seguridad** — dump de MySQL o PostgreSQL, archivado de ficheros hacia un almacenamiento remoto","**Renovación de certificados TLS** — `certbot 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 datos** — `rsync` hacia un segundo nodo, actualización de cachés","**Limpieza de entornos** — borrado de sesiones caducadas, vaciado de directorios temporales",{"type":35,"title":49,"body":50},"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 * * * \u002Fusr\u002Flocal\u002Fbin\u002Fbackup.sh` ejecuta el script todos los días a las 3. Los ficheros depositados en `\u002Fetc\u002Fcron.d\u002F` 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.",{"type":35,"title":52,"body":53},"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\u002F15` (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.",{"type":55,"title":56,"headers":57,"rows":61},"comparison","cron vs systemd timers: tabla comparativa",[58,59,60],"Criterio","cron","systemd timer",[62,66,70,74,78,82,86,90],[63,64,65],"Sintaxis de planificación","5 campos `* * * * *`","`OnCalendar=` legible (`daily`, `Mon 03:00`)",[67,68,69],"Logs","Salida por correo o redirección manual","journald nativo, `journalctl -u`",[71,72,73],"Tareas perdidas (máquina apagada)","Perdidas (salvo `anacron`)","Persistent=true las reproduce tras reiniciar",[75,76,77],"Dependencias entre servicios","Ninguna","`After=`, `Requires=`, `Wants=`",[79,80,81],"Aislamiento y recursos","Hereda el entorno del shell","Cgroups, `MemoryMax=`, `CPUQuota=`",[83,84,85],"Ejecución como un usuario concreto","Campo user en `\u002Fetc\u002Fcron.d\u002F`","`User=` y `Group=` en el `.service`",[87,88,89],"Depuración","Difícil sin logs","`systemctl status`, `journalctl -xe`",[91,92,93],"Disponibilidad","Todos los sistemas Unix","Sistemas con systemd (Debian, Ubuntu, RHEL…)",{"type":35,"title":95,"body":96},"¿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.",{"type":35,"title":98,"body":99},"¿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.",{"type":101,"title":102,"steps":103},"steps","Crear un timer de systemd desde cero (ejemplo: copia de seguridad diaria)",[104,107,110,113,116],{"title":105,"body":106},"Crear el fichero service","Abra `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.service` e introduzca: `[Unit]`, `Description=Copia de seguridad diaria de PostgreSQL`, `After=postgresql.service`, luego `[Service]`, `Type=oneshot`, `User=postgres`, `ExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbackup.sh`. El tipo `oneshot` indica que el servicio termina una vez ejecutado el script.",{"title":108,"body":109},"Crear el fichero timer","Cree `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.timer` con: `[Unit]`, `Description=Disparador diario de la copia de seguridad`, luego `[Timer]`, `OnCalendar=*-*-* 03:00:00`, `Persistent=true`, y `[Install]`, `WantedBy=timers.target`.",{"title":111,"body":112},"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.",{"title":114,"body":115},"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.",{"title":117,"body":118},"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.",{"type":101,"title":120,"steps":121},"Migrar una tarea cron existente a systemd",[122,125,128,131],{"title":123,"body":124},"Identificar la tarea cron que migrar","Liste sus crontabs con `crontab -l` (usuario actual) y `cat \u002Fetc\u002Fcron.d\u002F*` (sistema). Anote el comando exacto, el usuario de ejecución y la planificación en cinco campos. Por ejemplo: `30 2 * * 1 root \u002Fusr\u002Fbin\u002Fcertbot renew --quiet` significa cada lunes a las 2:30 como root.",{"title":126,"body":127},"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.",{"title":129,"body":130},"Crear los ficheros .service y .timer","Cree `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcertbot-renew.service` con `Type=oneshot`, `ExecStart=\u002Fusr\u002Fbin\u002Fcertbot renew --quiet` y `User=root`. Cree después `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcertbot-renew.timer` con `OnCalendar=Mon *-*-* 02:30:00` y `Persistent=true`. Ejecute `systemctl daemon-reload && systemctl enable --now certbot-renew.timer`.",{"title":132,"body":133},"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`.",{"type":135,"body":136},"tip","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.",{"type":35,"title":138,"body":139},"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]`.",{"type":35,"title":141,"body":142},"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.","Lanzar un VPS Linux","\u002Fvps-cloud",[148,164,179],{"id":149,"slug":150,"slugs":151,"title":155,"excerpt":156,"readTime":157,"views":158,"isPinned":19,"publishedAt":159,"updatedAt":21,"category":160,"categories":161,"featuredImage":29,"bgImage":30,"posterImage":163,"relatedSolution":29},31,"instalar-apache-airflow-en-un-vps",{"fr":152,"en":153,"ar":154,"es":150},"installer-apache-airflow-vps","installing-apache-airflow-on-a-vps-self-hosted-automation","تثبيت-apache-airflow-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Apache Airflow 3 en un VPS: guía completa y CVE-2026-58076","Despliega Apache Airflow 3 en tu VPS con Docker Compose: DAG en Python, CeleryExecutor, HTTPS — y la actualización 3.3.1 que corrige CVE-2026-58076.",10,0,"2026-05-20T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[162],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-apache-airflow-vps-poster.svg",{"id":165,"slug":166,"slugs":167,"title":171,"excerpt":172,"readTime":173,"views":18,"isPinned":19,"publishedAt":174,"updatedAt":21,"category":175,"categories":176,"featuredImage":29,"bgImage":30,"posterImage":178,"relatedSolution":29},212,"woodpecker-ci-forgejo-pipeline-cicd-vps",{"fr":168,"en":169,"ar":170,"es":166},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps","Woodpecker CI y Forgejo: pipeline CI\u002FCD en un VPS","Despliega Woodpecker CI v3 con Forgejo en tu VPS: configuración Docker Compose, pipelines YAML, secretos, runners multi-arquitectura y depuración OAuth.",11,"2026-08-02T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[177],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":180,"slug":181,"slugs":182,"title":186,"excerpt":187,"readTime":188,"views":17,"isPinned":19,"publishedAt":189,"updatedAt":21,"category":190,"categories":191,"featuredImage":29,"bgImage":30,"posterImage":193,"relatedSolution":194},29,"instalar-kestra-en-un-vps",{"fr":183,"en":184,"ar":185,"es":181},"installer-kestra-vps","installing-kestra-on-a-vps-self-hosted-automation","تثبيت-kestra-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Kestra en un VPS: automatización self-hosted","Instale Kestra en su VPS: orquestación de workflows declarativos en YAML para sus pipelines de datos y ETL, self-hosted con Docker.",3,"2026-05-22T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[192],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-kestra-vps-poster.svg",{"categorySlug":195,"appSlug":196},"automatizacion","kestra",1789665014584]