⏰ Programar copias: cron, intervalos y al detectar cambios
Cada tarea lleva un schedule_cron con tres formatos posibles.
Cron de 5 campos (hora local del motor)
┌ minuto (0-59)
│ ┌ hora (0-23)
│ │ ┌ día del mes (1-31)
│ │ │ ┌ mes (1-12)
│ │ │ │ ┌ día de semana (0-7, 0=domingo)
* * * * *
0 3 *→ cada día a las 03:00 hora local del motor./15 8-20 * 1-5→ cada 15 min, de 8:00 a 20:59, de lunes a viernes.- Soporta
,/n, listasa,b,cy rangosa-b.
Las horas son locales al equipo del motor y el cálculo salta los huecos del horario de verano correctamente (si las 03:00 no existe ese día, pasa a la siguiente válida).
Al arrancar, el motor recalcula next_run_at de todas las tareas — nada queda programado "a lo antiguo".
@every — intervalo absoluto
@every 30m cada 30 minutos desde la última ejecución
@every 2h cada 2 horas
@every 1d cada día (s, m, h, d)
Cuenta desde que terminó la última pasada, no en horas fijas. Útil para "quéjate si llevo X sin copiar" sin atarte a un reloj.
@onchange — al detectar cambios
@onchange dispara en cuanto el watcher ve cambios
@onchange 10m lo mismo, pero agrupando durante 10 min de margen
El motor vigila el origen con watchers nativos del SO: en cuanto algo cambia, la tarea corre. El debounce agrupa ráfagas (un npm install no lanza 500 copias). Las tareas @onchange no aparecen en el calendario del programador — su "horario" es continuo.
En la app
- El asistente de tarea ofrece atajos (cada hora, diario a las…, semanal…) y un campo libre para el cron.
- El Programador muestra en una semana todas las pasadas reales y las proyectadas de cada motor (programador visual).
- Una tarea
enabled=falseconserva su programación pero no corre.
Solapamientos
Si llega la hora de una tarea mientras sigue corriendo, no se duplica: espera o se salta según siga ocupada — el motor nunca corre dos veces la misma tarea en paralelo.