Tareas programadas (Cron)
Cron es el programador integrado del Gateway. Conserva los trabajos, activa el agente en el momento adecuado y puede entregar la salida de vuelta a un canal de chat o a un endpoint de webhook.Inicio rápido
Cómo funciona cron
- Cron se ejecuta dentro del proceso del Gateway (no dentro del modelo).
- Los trabajos se conservan en
~/.openclaw/cron/jobs.json, por lo que los reinicios no pierden las programaciones. - Todas las ejecuciones de cron crean registros de tareas en segundo plano.
- Los trabajos de una sola ejecución (
--at) se eliminan automáticamente después de un éxito de forma predeterminada. - Las ejecuciones aisladas de cron cierran, en la medida de lo posible, las pestañas/procesos del navegador rastreados para su sesión
cron:<jobId>cuando la ejecución se completa, para que la automatización desacoplada del navegador no deje procesos huérfanos. - Las ejecuciones aisladas de cron también protegen contra respuestas de confirmación obsoletas. Si el primer resultado es solo una actualización provisional de estado (
on it,pulling everything togethery pistas similares) y ninguna ejecución descendiente de subagente sigue siendo responsable de la respuesta final, OpenClaw vuelve a solicitar una vez el resultado real antes de entregarlo.
lost.
Tipos de programación
| Tipo | Indicador de CLI | Descripción |
|---|---|---|
at | --at | Marca de tiempo de una sola ejecución (ISO 8601 o relativa como 20m) |
every | --every | Intervalo fijo |
cron | --cron | Expresión cron de 5 campos o 6 campos con --tz opcional |
--tz America/New_York para una programación en hora local de reloj.
Las expresiones recurrentes al comienzo de cada hora se escalonan automáticamente hasta 5 minutos para reducir los picos de carga. Usa --exact para forzar una sincronización precisa o --stagger 30s para una ventana explícita.
El día del mes y el día de la semana usan lógica OR
Las expresiones cron son analizadas por croner. Cuando tanto los campos de día del mes como de día de la semana no son comodines, croner coincide cuando cualquiera de los campos coincide, no ambos. Este es el comportamiento estándar de Vixie cron.+ de Croner (0 9 15 * +1) o programa en un campo y valida el otro en el prompt o comando de tu trabajo.
Estilos de ejecución
| Estilo | Valor de --session | Se ejecuta en | Ideal para |
|---|---|---|---|
| Sesión principal | main | Siguiente turno de heartbeat | Recordatorios, eventos del sistema |
| Aislado | isolated | cron:<jobId> dedicado | Informes, tareas en segundo plano |
| Sesión actual | current | Vinculada en el momento de creación | Trabajo recurrente con contexto |
| Sesión personalizada | session:custom-id | Sesión nombrada persistente | Flujos de trabajo que se basan en el historial |
--wake now o --wake next-heartbeat). Los trabajos aislados ejecutan un turno de agente dedicado con una sesión nueva. Las sesiones personalizadas (session:xxx) conservan el contexto entre ejecuciones, lo que permite flujos de trabajo como resúmenes diarios que se basan en resúmenes anteriores.
Para los trabajos aislados, el desmontaje del runtime ahora incluye una limpieza del navegador en la medida de lo posible para esa sesión cron. Los fallos de limpieza se ignoran para que el resultado real de cron siga prevaleciendo.
Cuando las ejecuciones aisladas de cron orquestan subagentes, la entrega también prefiere la salida final descendiente sobre el texto provisional obsoleto del padre. Si los descendientes todavía se están ejecutando, OpenClaw suprime esa actualización parcial del padre en lugar de anunciarla.
Opciones de payload para trabajos aislados
--message: texto del prompt (obligatorio para aislado)--model/--thinking: reemplazos del modelo y nivel de razonamiento--light-context: omitir la inyección de archivos de arranque del espacio de trabajo--tools exec,read: restringir qué herramientas puede usar el trabajo
--model usa el modelo permitido seleccionado para ese trabajo. Si el modelo solicitado no está permitido, cron registra una advertencia y vuelve a la selección de modelo del agente/predeterminada del trabajo. Las cadenas de respaldo configuradas siguen aplicándose, pero un simple reemplazo de modelo sin una lista explícita de respaldo por trabajo ya no añade el primario del agente como un objetivo adicional de reintento oculto.
La precedencia de selección de modelo para trabajos aislados es:
- Reemplazo de modelo del hook de Gmail (cuando la ejecución provino de Gmail y ese reemplazo está permitido)
modeldel payload por trabajo- Reemplazo de modelo de la sesión cron almacenada
- Selección de modelo del agente/predeterminada
params.fastMode, el cron aislado lo usa de forma predeterminada. Un reemplazo almacenado de fastMode en la sesión sigue teniendo prioridad sobre la configuración en cualquier dirección.
Si una ejecución aislada encuentra una transferencia en vivo de cambio de modelo, cron reintenta con el proveedor/modelo cambiado y conserva esa selección activa antes de reintentar. Cuando el cambio también incluye un nuevo perfil de autenticación, cron también conserva ese reemplazo del perfil de autenticación. Los reintentos están acotados: después del intento inicial más 2 reintentos por cambio, cron aborta en lugar de entrar en un bucle infinito.
Entrega y salida
| Modo | Qué sucede |
|---|---|
announce | Entrega un resumen al canal de destino (predeterminado para aislado) |
webhook | Hace POST del payload del evento finalizado a una URL |
none | Solo interno, sin entrega |
--announce --channel telegram --to "-1001234567890" para la entrega al canal. Para temas de foro de Telegram, usa -1001234567890:topic:123. Los destinos de Slack/Discord/Mattermost deben usar prefijos explícitos (channel:<id>, user:<id>).
Para trabajos aislados propiedad de cron, el ejecutor es responsable de la ruta de entrega final. Se solicita al agente que devuelva un resumen en texto plano, y ese resumen luego se envía mediante announce, webhook o se mantiene interno para none. --no-deliver no devuelve la entrega al agente; mantiene la ejecución como interna.
Si la tarea original indica explícitamente enviar un mensaje a algún destinatario externo, el agente debe indicar a quién/dónde debe ir ese mensaje en su salida en lugar de intentar enviarlo directamente.
Las notificaciones de fallo siguen una ruta de destino separada:
cron.failureDestinationestablece un valor global predeterminado para las notificaciones de fallo.job.delivery.failureDestinationlo reemplaza por trabajo.- Si ninguno está configurado y el trabajo ya entrega mediante
announce, las notificaciones de fallo ahora vuelven a ese destino principal de anuncio. delivery.failureDestinationsolo es compatible con trabajossessionTarget="isolated"a menos que el modo principal de entrega seawebhook.
Ejemplos de CLI
Recordatorio de una sola ejecución (sesión principal):Webhooks
Gateway puede exponer endpoints HTTP de webhook para desencadenadores externos. Habilítalos en la configuración:Autenticación
Cada solicitud debe incluir el token del hook mediante un encabezado:Authorization: Bearer <token>(recomendado)x-openclaw-token: <token>
POST /hooks/wake
Encola un evento del sistema para la sesión principal:text(obligatorio): descripción del eventomode(opcional):now(predeterminado) onext-heartbeat
POST /hooks/agent
Ejecuta un turno de agente aislado:message (obligatorio), name, agentId, wakeMode, deliver, channel, to, model, thinking, timeoutSeconds.
Hooks mapeados (POST /hooks/<name>)
Los nombres de hook personalizados se resuelven mediantehooks.mappings en la configuración. Las asignaciones pueden transformar payloads arbitrarios en acciones wake o agent con plantillas o transformaciones de código.
Seguridad
- Mantén los endpoints de hook detrás de loopback, tailnet o un proxy inverso de confianza.
- Usa un token de hook dedicado; no reutilices tokens de autenticación del gateway.
- Mantén
hooks.pathen una subruta dedicada;/se rechaza. - Establece
hooks.allowedAgentIdspara limitar el enrutamiento explícito deagentId. - Mantén
hooks.allowRequestSessionKey=falsea menos que necesites sesiones seleccionadas por el solicitante. - Si habilitas
hooks.allowRequestSessionKey, establece tambiénhooks.allowedSessionKeyPrefixespara restringir las formas permitidas de la clave de sesión. - Los payloads del hook se encapsulan con límites de seguridad de forma predeterminada.
Integración de Gmail PubSub
Conecta desencadenadores del buzón de Gmail a OpenClaw mediante Google PubSub. Requisitos previos: CLI degcloud, gog (gogcli), hooks de OpenClaw habilitados, Tailscale para el endpoint público HTTPS.
Configuración con asistente (recomendada)
hooks.gmail, habilita el ajuste preestablecido de Gmail y usa Tailscale Funnel para el endpoint push.
Inicio automático del Gateway
Cuandohooks.enabled=true y hooks.gmail.account está configurado, el Gateway inicia gog gmail watch serve al arrancar y renueva automáticamente la suscripción. Establece OPENCLAW_SKIP_GMAIL_WATCHER=1 para excluirte.
Configuración manual de una sola vez
- Selecciona el proyecto de GCP que posee el cliente OAuth usado por
gog:
- Crea el tema y concede acceso push de Gmail:
- Inicia la suscripción:
Reemplazo de modelo de Gmail
Administrar trabajos
openclaw cron add|edit --model ...cambia el modelo seleccionado del trabajo.- Si el modelo está permitido, ese proveedor/modelo exacto llega a la ejecución del agente aislado.
- Si no está permitido, cron muestra una advertencia y vuelve a la selección de modelo del agente/predeterminada del trabajo.
- Las cadenas de respaldo configuradas siguen aplicándose, pero un simple reemplazo con
--modelsin una lista explícita de respaldo por trabajo ya no recurre al primario del agente como un objetivo adicional de reintento silencioso.
Configuración
cron.enabled: false o OPENCLAW_SKIP_CRON=1.
Reintento de una sola ejecución: los errores transitorios (límite de velocidad, sobrecarga, red, error del servidor) se reintentan hasta 3 veces con retroceso exponencial. Los errores permanentes se desactivan de inmediato.
Reintento recurrente: retroceso exponencial (de 30s a 60m) entre reintentos. El retroceso se restablece después de la siguiente ejecución exitosa.
Mantenimiento: cron.sessionRetention (predeterminado 24h) elimina las entradas de sesión de ejecuciones aisladas. cron.runLog.maxBytes / cron.runLog.keepLines eliminan automáticamente los archivos de registro de ejecución.
Solución de problemas
Secuencia de comandos
Cron no se ejecuta
- Verifica
cron.enabledy la variable de entornoOPENCLAW_SKIP_CRON. - Confirma que el Gateway esté ejecutándose de forma continua.
- Para programaciones
cron, verifica la zona horaria (--tz) frente a la zona horaria del host. reason: not-dueen la salida de ejecución significa que la ejecución manual se comprobó conopenclaw cron run <jobId> --duey que el trabajo aún no debía ejecutarse.
Cron se ejecutó pero no hubo entrega
- El modo de entrega
nonesignifica que no se espera ningún mensaje externo. - Un destino de entrega faltante o no válido (
channel/to) significa que se omitió la salida. - Los errores de autenticación del canal (
unauthorized,Forbidden) significan que la entrega fue bloqueada por las credenciales. - Si la ejecución aislada devuelve solo el token silencioso (
NO_REPLY/no_reply), OpenClaw suprime la entrega saliente directa y también la ruta de resumen en cola de respaldo, por lo que no se publica nada de vuelta en el chat. - Para trabajos aislados propiedad de cron, no esperes que el agente use la herramienta de mensajes como respaldo. El ejecutor es responsable de la entrega final;
--no-deliverla mantiene interna en lugar de permitir un envío directo.
Problemas habituales con zonas horarias
- Cron sin
--tzusa la zona horaria del host del gateway. - Las programaciones
atsin zona horaria se tratan como UTC. activeHoursde Heartbeat usa la resolución de zona horaria configurada.
Relacionado
- Automatización y tareas — todos los mecanismos de automatización de un vistazo
- Tareas en segundo plano — registro de tareas para ejecuciones de cron
- Heartbeat — turnos periódicos de la sesión principal
- Zona horaria — configuración de zona horaria