Cron è lo scheduler integrato del Gateway. Mantiene i job, risveglia l’agente al momento giusto e può restituire l’output a un canale chat o a un endpoint webhook.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Avvio rapido
Come funziona cron
- Cron viene eseguito dentro il processo Gateway (non dentro il modello).
- Le definizioni dei job persistono in
~/.openclaw/cron/jobs.json, quindi i riavvii non perdono le pianificazioni. - Lo stato di esecuzione runtime persiste accanto a esso in
~/.openclaw/cron/jobs-state.json. Se tieni traccia delle definizioni cron in git, tracciajobs.jsone aggiungijobs-state.jsona gitignore. - Dopo la separazione, le versioni precedenti di OpenClaw possono leggere
jobs.jsonma potrebbero trattare i job come nuovi perché i campi runtime ora risiedono injobs-state.json. - Quando
jobs.jsonviene modificato mentre il Gateway è in esecuzione o arrestato, OpenClaw confronta i campi di pianificazione modificati con i metadati degli slot runtime in sospeso e cancella i valori obsoleti dinextRunAtMs. Le riscritture di sola formattazione o solo ordine delle chiavi preservano lo slot in sospeso. - Tutte le esecuzioni cron creano record di attività in background.
- All’avvio del Gateway, i job isolati di turno agente scaduti vengono ripianificati fuori dalla finestra di connessione del canale invece di essere riprodotti immediatamente, così l’avvio di Discord/Telegram e la configurazione dei comandi nativi restano reattivi dopo i riavvii.
- I job una tantum (
--at) vengono eliminati automaticamente dopo il successo per impostazione predefinita. - Le esecuzioni cron isolate chiudono con il massimo impegno le schede/processi browser tracciati per la loro sessione
cron:<jobId>al completamento dell’esecuzione, così l’automazione browser scollegata non lascia processi orfani. - Le esecuzioni cron isolate che ricevono la concessione ristretta di autopulizia cron possono comunque leggere lo stato dello scheduler, un elenco autofilterato del loro job corrente e la cronologia delle esecuzioni di quel job, così i controlli di stato/heartbeat possono ispezionare la propria pianificazione senza ottenere un accesso più ampio alla mutazione cron.
- Le esecuzioni cron isolate proteggono anche dalle risposte di conferma obsolete. Se il primo risultato è solo un aggiornamento di stato provvisorio (
on it,pulling everything togethere suggerimenti simili) e nessuna esecuzione di subagent discendente è ancora responsabile della risposta finale, OpenClaw richiede una volta il risultato effettivo prima della consegna. - Le esecuzioni cron isolate preferiscono i metadati strutturati di negazione dell’esecuzione provenienti dall’esecuzione incorporata, poi ripiegano su marcatori noti di riepilogo/output finale come
SYSTEM_RUN_DENIEDeINVALID_REQUEST, così un comando bloccato non viene segnalato come esecuzione riuscita. - Le esecuzioni cron isolate trattano anche gli errori dell’agente a livello di esecuzione come errori del job anche quando non viene prodotto alcun payload di risposta, così gli errori di modello/provider incrementano i contatori di errore e attivano notifiche di errore invece di contrassegnare il job come riuscito.
- Quando un job isolato di turno agente raggiunge
timeoutSeconds, cron interrompe l’esecuzione dell’agente sottostante e gli concede una breve finestra di pulizia. Se l’esecuzione non si svuota, la pulizia di proprietà del Gateway forza la rimozione della proprietà della sessione di quell’esecuzione prima che cron registri il timeout, così il lavoro chat in coda non resta bloccato dietro una sessione di elaborazione obsoleta. - Se un turno agente isolato si blocca prima dell’avvio del runner o prima della prima chiamata al modello, cron registra un timeout specifico della fase come
setup timed out before runner startostalled before first model call (last phase: context-engine). Questi watchdog coprono provider incorporati e provider basati su CLI prima che il loro processo CLI esterno venga effettivamente avviato, e hanno limiti indipendenti dai valori lunghi ditimeoutSecondscosì gli errori di avvio a freddo/auth/contesto emergono rapidamente invece di attendere l’intero budget del job.
La riconciliazione delle attività per cron è prima di proprietà del runtime e poi basata sulla cronologia durabile: un’attività cron attiva resta live mentre il runtime cron traccia ancora quel job come in esecuzione, anche se esiste ancora una vecchia riga di sessione figlia. Una volta che il runtime smette di possedere il job e scade la finestra di tolleranza di 5 minuti, la manutenzione controlla i log di esecuzione persistiti e lo stato del job per l’esecuzione corrispondente
cron:<jobId>:<startedAt>. Se quella cronologia durabile mostra un risultato terminale, il registro delle attività viene finalizzato da essa; altrimenti la manutenzione di proprietà del Gateway può contrassegnare l’attività come lost. L’audit CLI offline può recuperare dalla cronologia durabile, ma non tratta il proprio insieme vuoto di job attivi in-process come prova che un’esecuzione cron di proprietà del Gateway sia scomparsa.Tipi di pianificazione
| Tipo | Flag CLI | Descrizione |
|---|---|---|
at | --at | Timestamp una tantum (ISO 8601 o relativo come 20m) |
every | --every | Intervallo fisso |
cron | --cron | Espressione cron a 5 o 6 campi con --tz opzionale |
--tz America/New_York per la pianificazione con orario locale.
Le espressioni ricorrenti a inizio ora vengono automaticamente scaglionate fino a 5 minuti per ridurre i picchi di carico. Usa --exact per forzare una temporizzazione precisa o --stagger 30s per una finestra esplicita.
Giorno del mese e giorno della settimana usano logica OR
Le espressioni Cron vengono analizzate da croner. Quando sia il campo giorno del mese sia il campo giorno della settimana non sono wildcard, croner corrisponde quando uno dei due campi corrisponde, non entrambi. Questo è il comportamento standard di Vixie cron.+ di Croner (0 9 15 * +1) oppure pianifica su un campo e controlla l’altro nel prompt o comando del tuo job.
Stili di esecuzione
| Stile | Valore --session | Viene eseguito in | Ideale per |
|---|---|---|---|
| Sessione principale | main | Prossimo turno heartbeat | Promemoria, eventi di sistema |
| Isolato | isolated | cron:<jobId> dedicato | Report, attività in background |
| Sessione corrente | current | Associata al momento della creazione | Lavoro ricorrente consapevole del contesto |
| Sessione personalizzata | session:custom-id | Sessione denominata persistente | Workflow che si basano sulla cronologia |
Sessione principale vs isolata vs personalizzata
Sessione principale vs isolata vs personalizzata
I job della sessione principale mettono in coda un evento di sistema e, opzionalmente, risvegliano l’heartbeat (
--wake now o --wake next-heartbeat). Questi eventi di sistema non estendono la freschezza del reset giornaliero/inattivo per la sessione di destinazione. I job isolati eseguono un turno agente dedicato con una sessione nuova. Le sessioni personalizzate (session:xxx) mantengono il contesto tra le esecuzioni, abilitando workflow come standup quotidiani che si basano sui riepiloghi precedenti.Cosa significa 'sessione nuova' per i job isolati
Cosa significa 'sessione nuova' per i job isolati
Per i job isolati, “sessione nuova” significa un nuovo ID transcript/sessione per ogni esecuzione. OpenClaw può portare preferenze sicure come impostazioni di pensiero/veloce/verboso, etichette e override espliciti selezionati dall’utente per modello/auth, ma non eredita il contesto conversazionale ambientale da una riga cron precedente: routing canale/gruppo, criterio di invio o coda, elevazione, origine o binding runtime ACP. Usa
current o session:<id> quando un job ricorrente deve deliberatamente basarsi sullo stesso contesto conversazionale.Pulizia runtime
Pulizia runtime
Per i job isolati, lo smontaggio runtime ora include la pulizia browser con il massimo impegno per quella sessione cron. Gli errori di pulizia vengono ignorati, così il risultato cron effettivo resta prevalente.Le esecuzioni cron isolate eliminano anche tutte le istanze runtime MCP incluse create per il job tramite il percorso condiviso di pulizia runtime. Questo corrisponde al modo in cui i client MCP della sessione principale e della sessione personalizzata vengono smontati, così i job cron isolati non perdono processi figli stdio o connessioni MCP di lunga durata tra le esecuzioni.
Consegna di subagent e Discord
Consegna di subagent e Discord
Quando le esecuzioni cron isolate orchestrano subagent, la consegna preferisce anche l’output finale del discendente rispetto al testo provvisorio obsoleto del genitore. Se i discendenti sono ancora in esecuzione, OpenClaw sopprime quell’aggiornamento parziale del genitore invece di annunciarlo.Per le destinazioni di annuncio Discord solo testo, OpenClaw invia una sola volta il testo finale canonico dell’assistente invece di riprodurre sia i payload di testo in streaming/intermedi sia la risposta finale. I payload multimediali e strutturati di Discord vengono comunque consegnati come payload separati, così allegati e componenti non vengono scartati.
Opzioni payload per job isolati
Testo del prompt (obbligatorio per isolati).
Override del modello; usa il modello consentito selezionato per il job.
Override del livello di pensiero.
Salta l’iniezione del file di bootstrap dell’area di lavoro.
Limita quali strumenti può usare il job, per esempio
--tools exec,read.--model usa il modello consentito selezionato come modello primario di quel job. Non è lo stesso di un override /model della sessione chat: le catene di fallback configurate si applicano comunque quando il primario del job fallisce. Se il modello richiesto non è consentito o non può essere risolto, cron fa fallire l’esecuzione con un errore di validazione esplicito invece di ripiegare silenziosamente sulla selezione agente/modello predefinita del job.
I job Cron possono anche contenere fallbacks a livello di payload. Quando presente, quell’elenco sostituisce la catena di fallback configurata per il job. Usa fallbacks: [] nel payload/API del job quando vuoi un’esecuzione cron rigorosa che provi solo il modello selezionato. Se un job ha --model ma non ha fallback né di payload né configurati, OpenClaw passa un override di fallback vuoto esplicito così il primario dell’agente non viene aggiunto come destinazione di riprova extra nascosta.
La precedenza di selezione del modello per i job isolati è:
- Override del modello dell’hook Gmail (quando l’esecuzione proviene da Gmail e quell’override è consentito)
modeldel payload per job- Override del modello della sessione cron memorizzato selezionato dall’utente
- Selezione agente/modello predefinita
params.fastMode, cron isolato la usa per impostazione predefinita. Un override fastMode della sessione memorizzata prevale comunque sulla configurazione in entrambe le direzioni.
Se un’esecuzione isolata incontra un passaggio live di cambio modello, cron riprova con il provider/modello cambiato e persiste quella selezione live per l’esecuzione attiva prima di riprovare. Quando il cambio porta anche un nuovo profilo auth, cron persiste anche quell’override del profilo auth per l’esecuzione attiva. I tentativi sono limitati: dopo il tentativo iniziale più 2 tentativi di cambio, cron interrompe invece di continuare all’infinito.
Prima che un’esecuzione Cron isolata entri nel runner dell’agente, OpenClaw controlla gli endpoint dei provider locali raggiungibili per i provider configurati api: "ollama" e api: "openai-completions" il cui baseUrl è loopback, rete privata o .local. Se quell’endpoint non è attivo, l’esecuzione viene registrata come skipped con un chiaro errore provider/modello invece di avviare una chiamata al modello. Il risultato dell’endpoint viene memorizzato nella cache per 5 minuti, quindi molti job scaduti che usano lo stesso server locale Ollama, vLLM, SGLang o LM Studio non funzionante condividono un piccolo probe invece di creare una tempesta di richieste. Le esecuzioni saltate dal preflight del provider non incrementano il backoff degli errori di esecuzione; abilita failureAlert.includeSkipped quando vuoi notifiche ripetute per i salti.
Consegna e output
| Modalità | Cosa succede |
|---|---|
announce | Consegna di fallback del testo finale al target se l’agente non lo ha inviato |
webhook | POST del payload dell’evento completato a un URL |
none | Nessuna consegna di fallback del runner |
--announce --channel telegram --to "-1001234567890" per la consegna al canale. Per gli argomenti dei forum Telegram, usa -1001234567890:topic:123; i chiamanti RPC/config diretti possono anche passare delivery.threadId come stringa o numero. I target Slack/Discord/Mattermost dovrebbero usare prefissi espliciti (channel:<id>, user:<id>). Gli ID delle stanze Matrix fanno distinzione tra maiuscole e minuscole; usa l’ID stanza esatto o la forma room:!room:server da Matrix.
Quando la consegna announce usa channel: "last" oppure omette channel, un target con prefisso provider come telegram:123 può selezionare il canale prima che Cron ripieghi sulla cronologia della sessione o su un singolo canale configurato. Solo i prefissi dichiarati dal plugin caricato sono selettori di provider. Se delivery.channel è esplicito, il prefisso del target deve indicare lo stesso provider; per esempio, channel: "whatsapp" con to: "telegram:123" viene rifiutato invece di lasciare che WhatsApp interpreti l’ID Telegram come un numero di telefono. I prefissi di tipo target e servizio come channel:<id>, user:<id>, imessage:<handle> e sms:<number> restano sintassi target di proprietà del canale, non selettori di provider.
Per i job isolati, la consegna chat è condivisa. Se è disponibile una route chat, l’agente può usare lo strumento message anche quando il job usa --no-deliver. Se l’agente invia al target configurato/corrente, OpenClaw salta l’annuncio di fallback. Altrimenti announce, webhook e none controllano solo cosa fa il runner con la risposta finale dopo il turno dell’agente.
Quando un agente crea un promemoria isolato da una chat attiva, OpenClaw archivia il target di consegna live preservato per la route announce di fallback. Le chiavi di sessione interne possono essere minuscole; i target di consegna del provider non vengono ricostruiti da quelle chiavi quando il contesto chat corrente è disponibile.
La consegna announce implicita usa allowlist di canale configurate per convalidare e reinstradare target obsoleti. Le approvazioni DM del pairing store non sono destinatari dell’automazione di fallback; imposta delivery.to oppure configura la voce allowFrom del canale quando un job pianificato deve inviare proattivamente a un DM.
Le notifiche di errore seguono un percorso di destinazione separato:
cron.failureDestinationimposta un valore predefinito globale per le notifiche di errore.job.delivery.failureDestinationlo sovrascrive per singolo job.- Se nessuno dei due è impostato e il job consegna già tramite
announce, le notifiche di errore ora ripiegano su quel target announce primario. delivery.failureDestinationè supportato solo sui jobsessionTarget="isolated", a meno che la modalità di consegna primaria siawebhook.failureAlert.includeSkipped: trueabilita per un job o per la policy globale degli avvisi Cron gli avvisi ripetuti per le esecuzioni saltate. Le esecuzioni saltate mantengono un contatore consecutivo separato, quindi non influiscono sul backoff degli errori di esecuzione.
Esempi CLI
- Promemoria una tantum
- Job isolato ricorrente
- Sovrascrittura di modello e ragionamento
Webhook
Gateway può esporre endpoint Webhook HTTP per trigger esterni. Abilita nella configurazione:Autenticazione
Ogni richiesta deve includere il token dell’hook tramite header:Authorization: Bearer <token>(consigliato)x-openclaw-token: <token>
POST /hooks/wake
POST /hooks/wake
POST /hooks/agent
POST /hooks/agent
Esegue un turno agente isolato:Campi:
message (obbligatorio), name, agentId, wakeMode, deliver, channel, to, model, fallbacks, thinking, timeoutSeconds.Hook mappati (POST /hooks/<name>)
Hook mappati (POST /hooks/<name>)
I nomi degli hook personalizzati vengono risolti tramite
hooks.mappings nella configurazione. Le mappature possono trasformare payload arbitrari in azioni wake o agent con template o trasformazioni di codice.Integrazione Gmail PubSub
Collega i trigger della posta in arrivo Gmail a OpenClaw tramite Google PubSub.Prerequisiti: CLI
gcloud, gog (gogcli), hook OpenClaw abilitati, Tailscale per l’endpoint HTTPS pubblico.Configurazione guidata (consigliata)
hooks.gmail, abilita il preset Gmail e usa Tailscale Funnel per l’endpoint push.
Avvio automatico del Gateway
Quandohooks.enabled=true e hooks.gmail.account è impostato, il Gateway avvia gog gmail watch serve al boot e rinnova automaticamente il watch. Imposta OPENCLAW_SKIP_GMAIL_WATCHER=1 per disattivarlo.
Configurazione manuale una tantum
Sovrascrittura del modello Gmail
Gestione dei job
Nota sulla sovrascrittura del modello:
openclaw cron add|edit --model ...cambia il modello selezionato del job.- Se il modello è consentito, quel provider/modello esatto raggiunge l’esecuzione dell’agente isolato.
- Se non è consentito o non può essere risolto, Cron fa fallire l’esecuzione con un errore di convalida esplicito.
- Le catene di fallback configurate si applicano comunque perché
--modeldi Cron è un valore primario del job, non una sovrascrittura/modeldella sessione. - Il payload
fallbackssostituisce i fallback configurati per quel job;fallbacks: []disabilita il fallback e rende l’esecuzione rigorosa. - Un semplice
--modelsenza un elenco di fallback esplicito o configurato non passa al primario dell’agente come target di retry extra silenzioso.
Configurazione
maxConcurrentRuns limita sia il dispatch Cron pianificato sia l’esecuzione dei turni agente isolati. I turni agente Cron isolati usano internamente la lane di esecuzione dedicata cron-nested della coda, quindi aumentare questo valore consente a esecuzioni LLM Cron indipendenti di avanzare in parallelo invece di avviare solo i rispettivi wrapper Cron esterni. La lane condivisa non-Cron nested non viene ampliata da questa impostazione.
Il sidecar di stato runtime è derivato da cron.store: uno store .json come ~/clawd/cron/jobs.json usa ~/clawd/cron/jobs-state.json, mentre un percorso store senza suffisso .json aggiunge -state.json.
Se modifichi manualmente jobs.json, lascia jobs-state.json fuori dal controllo versione. OpenClaw usa quel sidecar per slot in sospeso, marker attivi, metadati dell’ultima esecuzione e identità della pianificazione che indica allo scheduler quando un job modificato esternamente richiede un nuovo nextRunAtMs.
Disabilita Cron: cron.enabled: false o OPENCLAW_SKIP_CRON=1.
Comportamento di retry
Comportamento di retry
Retry una tantum: gli errori transitori (limite di frequenza, sovraccarico, rete, errore server) vengono ritentati fino a 3 volte con backoff esponenziale. Gli errori permanenti disabilitano immediatamente.Retry ricorrente: backoff esponenziale (da 30s a 60m) tra i retry. Il backoff viene reimpostato dopo la successiva esecuzione riuscita.
Manutenzione
Manutenzione
cron.sessionRetention (predefinito 24h) elimina le voci isolate delle sessioni di esecuzione. cron.runLog.maxBytes / cron.runLog.keepLines eliminano automaticamente i file dei log di esecuzione.Risoluzione dei problemi
Sequenza di comandi
Cron non si attiva
Cron non si attiva
- Controlla
cron.enablede la variabile d’ambienteOPENCLAW_SKIP_CRON. - Conferma che il Gateway sia in esecuzione in modo continuativo.
- Per le pianificazioni
cron, verifica il fuso orario (--tz) rispetto al fuso orario dell’host. reason: not-duenell’output dell’esecuzione significa che l’esecuzione manuale è stata verificata conopenclaw cron run <jobId> --duee che il job non era ancora dovuto.
Cron attivato ma nessuna consegna
Cron attivato ma nessuna consegna
- La modalità di consegna
nonesignifica che non è previsto alcun invio di fallback del runner. L’agente può comunque inviare direttamente con lo strumentomessagequando è disponibile una route di chat. - Destinazione di consegna mancante/non valida (
channel/to) significa che l’invio in uscita è stato saltato. - Per Matrix, i job copiati o legacy con ID stanza
delivery.toin minuscolo possono non riuscire perché gli ID stanza Matrix distinguono tra maiuscole e minuscole. Modifica il job impostando il valore esatto!room:serveroroom:!room:serverda Matrix. - Gli errori di autenticazione del canale (
unauthorized,Forbidden) significano che la consegna è stata bloccata dalle credenziali. - Se l’esecuzione isolata restituisce solo il token silenzioso (
NO_REPLY/no_reply), OpenClaw sopprime la consegna diretta in uscita e sopprime anche il percorso di riepilogo accodato di fallback, quindi non viene pubblicato nulla di nuovo nella chat. - Se l’agente deve inviare un messaggio all’utente autonomamente, controlla che il job abbia una route utilizzabile (
channel: "last"con una chat precedente, oppure un canale/target esplicito).
Cron o Heartbeat sembrano impedire il rollover in stile /new
Cron o Heartbeat sembrano impedire il rollover in stile /new
- La freschezza del reset giornaliero e per inattività non si basa su
updatedAt; consulta Gestione delle sessioni. - Le riattivazioni di Cron, le esecuzioni di Heartbeat, le notifiche exec e la contabilità del Gateway possono aggiornare la riga della sessione per instradamento/stato, ma non estendono
sessionStartedAtolastInteractionAt. - Per le righe legacy create prima che quei campi esistessero, OpenClaw può recuperare
sessionStartedAtdall’intestazione di sessione JSONL della trascrizione quando il file è ancora disponibile. Le righe legacy inattive senzalastInteractionAtusano quell’ora di inizio recuperata come riferimento di inattività.
Problemi comuni con i fusi orari
Problemi comuni con i fusi orari
- Cron senza
--tzusa il fuso orario dell’host Gateway. - Le pianificazioni
atsenza fuso orario sono trattate come UTC. activeHoursdi Heartbeat usa la risoluzione del fuso orario configurata.
Correlati
- Automazione — tutti i meccanismi di automazione in sintesi
- Attività in background — registro delle attività per le esecuzioni Cron
- Heartbeat — turni periodici della sessione principale
- Fuso orario — configurazione del fuso orario