Tugas Terjadwal (Cron)
Cron adalah penjadwal bawaan Gateway. Cron menyimpan job secara persisten, membangunkan agen pada waktu yang tepat, dan dapat mengirimkan output kembali ke channel chat atau endpoint Webhook.Mulai cepat
Cara kerja cron
- Cron berjalan di dalam proses Gateway (bukan di dalam model).
- Definisi job disimpan secara persisten di
~/.openclaw/cron/jobs.jsonsehingga restart tidak menghilangkan jadwal. - Status eksekusi runtime disimpan secara persisten di sebelahnya dalam
~/.openclaw/cron/jobs-state.json. Jika Anda melacak definisi cron di git, lacakjobs.jsondan tambahkanjobs-state.jsonke gitignore. - Setelah pemisahan ini, versi OpenClaw yang lebih lama dapat membaca
jobs.jsontetapi mungkin memperlakukan job sebagai baru karena field runtime sekarang berada dijobs-state.json. - Semua eksekusi cron membuat catatan tugas latar belakang.
- Job sekali jalan (
--at) akan terhapus otomatis setelah berhasil secara bawaan. - Eksekusi cron terisolasi menutup tab/proses browser yang dilacak untuk sesi
cron:<jobId>mereka secara best-effort saat eksekusi selesai, sehingga otomatisasi browser yang terlepas tidak meninggalkan proses yatim. - Eksekusi cron terisolasi juga melindungi dari balasan pengakuan yang usang. Jika hasil pertama hanya berupa pembaruan status sementara (
on it,pulling everything together, dan petunjuk serupa) dan tidak ada eksekusi subagen turunan yang masih bertanggung jawab atas jawaban akhir, OpenClaw akan melakukan prompt ulang sekali untuk hasil yang sebenarnya sebelum pengiriman.
lost.
Jenis jadwal
| Jenis | Flag CLI | Deskripsi |
|---|---|---|
at | --at | Stempel waktu sekali jalan (ISO 8601 atau relatif seperti 20m) |
every | --every | Interval tetap |
cron | --cron | Ekspresi cron 5-field atau 6-field dengan --tz opsional |
--tz America/New_York untuk penjadwalan waktu lokal sesuai jam setempat.
Ekspresi berulang tepat di awal jam akan diacak otomatis hingga 5 menit untuk mengurangi lonjakan beban. Gunakan --exact untuk memaksa waktu yang presisi atau --stagger 30s untuk jendela eksplisit.
Day-of-month dan day-of-week menggunakan logika OR
Ekspresi cron diurai oleh croner. Ketika field day-of-month dan day-of-week keduanya bukan wildcard, croner mencocokkan saat salah satu field cocok — bukan keduanya. Ini adalah perilaku cron Vixie standar.+ milik Croner (0 9 15 * +1) atau jadwalkan pada satu field dan cek field lainnya dalam prompt atau perintah job Anda.
Gaya eksekusi
| Gaya | Nilai --session | Berjalan di | Paling cocok untuk |
|---|---|---|---|
| Sesi utama | main | Giliran Heartbeat berikutnya | Pengingat, peristiwa sistem |
| Terisolasi | isolated | cron:<jobId> khusus | Laporan, pekerjaan latar belakang |
| Sesi saat ini | current | Terikat saat dibuat | Pekerjaan berulang berbasis konteks |
| Sesi kustom | session:custom-id | Sesi bernama persisten | Alur kerja yang dibangun dari riwayat |
--wake now atau --wake next-heartbeat). Job terisolasi menjalankan giliran agen khusus dengan sesi baru. Sesi kustom (session:xxx) mempertahankan konteks antar eksekusi, sehingga memungkinkan alur kerja seperti standup harian yang dibangun dari ringkasan sebelumnya.
Untuk job terisolasi, teardown runtime sekarang mencakup pembersihan browser best-effort untuk sesi cron tersebut. Kegagalan pembersihan diabaikan agar hasil cron yang sebenarnya tetap diprioritaskan.
Saat eksekusi cron terisolasi mengorkestrasi subagen, pengiriman juga lebih memprioritaskan output turunan akhir daripada teks sementara parent yang usang. Jika turunan masih berjalan, OpenClaw menekan pembaruan parent parsial itu alih-alih mengumumkannya.
Opsi payload untuk job terisolasi
--message: teks prompt (wajib untuk job terisolasi)--model/--thinking: override model dan tingkat thinking--light-context: lewati injeksi file bootstrap workspace--tools exec,read: batasi tool yang dapat digunakan job
--model menggunakan model yang dipilih dan diizinkan untuk job tersebut. Jika model yang diminta tidak diizinkan, cron mencatat peringatan dan kembali memakai pilihan model agen/default job tersebut. Rantai fallback yang dikonfigurasi tetap berlaku, tetapi override model biasa tanpa daftar fallback eksplisit per-job tidak lagi menambahkan model utama agen sebagai target percobaan ulang ekstra yang tersembunyi.
Urutan prioritas pemilihan model untuk job terisolasi adalah:
- Override model hook Gmail (ketika eksekusi berasal dari Gmail dan override tersebut diizinkan)
modelpayload per-job- Override model sesi cron yang tersimpan
- Pemilihan model agen/default
params.fastMode, cron terisolasi menggunakannya secara bawaan. Override fastMode sesi yang tersimpan tetap diprioritaskan atas konfigurasi, ke arah mana pun.
Jika eksekusi terisolasi menemui handoff perpindahan model live, cron mencoba ulang dengan provider/model yang telah dipindahkan dan menyimpan pilihan live itu sebelum mencoba ulang. Saat perpindahan juga membawa auth profile baru, cron juga menyimpan override auth profile tersebut. Percobaan ulang dibatasi: setelah percobaan awal ditambah 2 percobaan ulang perpindahan, cron membatalkan alih-alih berputar tanpa akhir.
Pengiriman dan output
| Mode | Yang terjadi |
|---|---|
announce | Kirim fallback teks akhir ke target jika agen tidak mengirim |
webhook | POST payload peristiwa selesai ke URL |
none | Tidak ada pengiriman fallback oleh runner |
--announce --channel telegram --to "-1001234567890" untuk pengiriman ke channel. Untuk topik forum Telegram, gunakan -1001234567890:topic:123. Target Slack/Discord/Mattermost harus menggunakan prefix eksplisit (channel:<id>, user:<id>).
Untuk job terisolasi, pengiriman chat bersifat bersama. Jika rute chat tersedia, agen dapat menggunakan tool message bahkan ketika job memakai --no-deliver. Jika agen mengirim ke target yang dikonfigurasi/saat ini, OpenClaw melewati fallback announce. Jika tidak, announce, webhook, dan none hanya mengontrol apa yang dilakukan runner terhadap balasan akhir setelah giliran agen.
Notifikasi kegagalan mengikuti jalur tujuan terpisah:
cron.failureDestinationmenetapkan bawaan global untuk notifikasi kegagalan.job.delivery.failureDestinationmengganti itu per job.- Jika keduanya tidak disetel dan job sudah mengirim melalui
announce, notifikasi kegagalan sekarang fallback ke target announce utama tersebut. delivery.failureDestinationhanya didukung pada jobsessionTarget="isolated"kecuali mode pengiriman utama adalahwebhook.
Contoh CLI
Pengingat sekali jalan (sesi utama):Webhook
Gateway dapat mengekspos endpoint Webhook HTTP untuk pemicu eksternal. Aktifkan dalam config:Autentikasi
Setiap permintaan harus menyertakan token hook melalui header:Authorization: Bearer <token>(disarankan)x-openclaw-token: <token>
POST /hooks/wake
Mengantrikan peristiwa sistem untuk sesi utama:text(wajib): deskripsi peristiwamode(opsional):now(bawaan) ataunext-heartbeat
POST /hooks/agent
Menjalankan giliran agen terisolasi:message (wajib), name, agentId, wakeMode, deliver, channel, to, model, thinking, timeoutSeconds.
Hook terpetakan (POST /hooks/<name>)
Nama hook kustom di-resolve melaluihooks.mappings dalam config. Mapping dapat mentransformasikan payload arbitrer menjadi aksi wake atau agent dengan template atau transformasi kode.
Keamanan
- Simpan endpoint hook di balik loopback, tailnet, atau reverse proxy tepercaya.
- Gunakan token hook khusus; jangan gunakan ulang token auth gateway.
- Simpan
hooks.pathpada subpath khusus;/ditolak. - Tetapkan
hooks.allowedAgentIdsuntuk membatasi routingagentIdeksplisit. - Biarkan
hooks.allowRequestSessionKey=falsekecuali Anda membutuhkan sesi yang dipilih pemanggil. - Jika Anda mengaktifkan
hooks.allowRequestSessionKey, tetapkan jugahooks.allowedSessionKeyPrefixesuntuk membatasi bentuk session key yang diizinkan. - Payload hook dibungkus dengan batasan keamanan secara bawaan.
Integrasi Gmail PubSub
Hubungkan pemicu kotak masuk Gmail ke OpenClaw melalui Google PubSub. Prasyarat: CLIgcloud, gog (gogcli), hook OpenClaw diaktifkan, Tailscale untuk endpoint HTTPS publik.
Penyiapan wizard (disarankan)
hooks.gmail, mengaktifkan preset Gmail, dan menggunakan Tailscale Funnel untuk endpoint push.
Auto-start Gateway
Saathooks.enabled=true dan hooks.gmail.account disetel, Gateway memulai gog gmail watch serve saat boot dan memperbarui watch secara otomatis. Tetapkan OPENCLAW_SKIP_GMAIL_WATCHER=1 untuk memilih tidak menggunakannya.
Penyiapan manual sekali jalan
- Pilih project GCP yang memiliki klien OAuth yang digunakan oleh
gog:
- Buat topik dan berikan akses push Gmail:
- Mulai watch:
Override model Gmail
Mengelola job
openclaw cron add|edit --model ...mengubah model yang dipilih job.- Jika model diizinkan, provider/model yang tepat itu akan sampai ke eksekusi agen terisolasi.
- Jika tidak diizinkan, cron akan memperingatkan dan kembali ke pemilihan model agen/default job.
- Rantai fallback yang dikonfigurasi tetap berlaku, tetapi override
--modelbiasa tanpa daftar fallback eksplisit per-job tidak lagi jatuh ke model utama agen sebagai target percobaan ulang tambahan yang diam-diam.
Konfigurasi
cron.store: penyimpanan .json seperti ~/clawd/cron/jobs.json menggunakan ~/clawd/cron/jobs-state.json, sedangkan path penyimpanan tanpa sufiks .json menambahkan -state.json.
Nonaktifkan cron: cron.enabled: false atau OPENCLAW_SKIP_CRON=1.
Percobaan ulang sekali jalan: error sementara (batas laju, kelebihan beban, jaringan, error server) dicoba ulang hingga 3 kali dengan exponential backoff. Error permanen langsung dinonaktifkan.
Percobaan ulang berulang: exponential backoff (30 detik hingga 60 menit) di antara percobaan ulang. Backoff di-reset setelah eksekusi sukses berikutnya.
Pemeliharaan: cron.sessionRetention (bawaan 24h) memangkas entri sesi-eksekusi terisolasi. cron.runLog.maxBytes / cron.runLog.keepLines memangkas otomatis file run-log.
Pemecahan masalah
Urutan perintah
Cron tidak terpicu
- Periksa
cron.enableddan variabel envOPENCLAW_SKIP_CRON. - Pastikan Gateway berjalan terus-menerus.
- Untuk jadwal
cron, verifikasi zona waktu (--tz) dibanding zona waktu host. reason: not-duepada output eksekusi berarti eksekusi manual diperiksa denganopenclaw cron run <jobId> --duedan job belum jatuh tempo.
Cron terpicu tetapi tidak ada pengiriman
- Mode pengiriman
noneberarti tidak ada pengiriman fallback runner yang diharapkan. Agen masih dapat mengirim langsung dengan toolmessagesaat rute chat tersedia. - Target pengiriman hilang/tidak valid (
channel/to) berarti pengiriman keluar dilewati. - Error auth channel (
unauthorized,Forbidden) berarti pengiriman diblokir oleh kredensial. - Jika eksekusi terisolasi hanya mengembalikan token senyap (
NO_REPLY/no_reply), OpenClaw menekan pengiriman keluar langsung dan juga menekan jalur ringkasan antrean fallback, sehingga tidak ada yang diposting kembali ke chat. - Jika agen seharusnya mengirim pesan ke pengguna sendiri, periksa bahwa job memiliki rute yang dapat digunakan (
channel: "last"dengan chat sebelumnya, atau channel/target eksplisit).
Gotcha zona waktu
- Cron tanpa
--tzmenggunakan zona waktu host gateway. - Jadwal
attanpa zona waktu diperlakukan sebagai UTC. - Heartbeat
activeHoursmenggunakan resolusi zona waktu yang dikonfigurasi.
Terkait
- Automation & Tasks — semua mekanisme otomatisasi secara ringkas
- Background Tasks — ledger tugas untuk eksekusi cron
- Heartbeat — giliran sesi utama periodik
- Timezone — konfigurasi zona waktu