⏰ 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, listas a,b,c y rangos a-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=false conserva 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.