Automation
کارهای زمانبندیشده
Cron زمانبند داخلی Gateway است. کارها را پایدار میکند، عامل را در زمان درست بیدار میکند، و میتواند خروجی را به یک کانال چت یا نقطه پایانی Webhook برساند.
شروع سریع
Add a one-shot reminder
openclaw cron create "2026-02-01T16:00:00Z" \ --name "Reminder" \ --session main \ --system-event "Reminder: check the cron docs draft" \ --wake now \ --delete-after-runCheck your jobs
openclaw cron listopenclaw cron get <job-id>openclaw cron show <job-id>See run history
openclaw cron runs --id <job-id>نحوه کار Cron
- Cron داخل فرایند Gateway اجرا میشود (نه داخل مدل).
- تعریفهای کار، وضعیت زمان اجرا، و تاریخچه اجرا در پایگاه داده وضعیت SQLite مشترک OpenClaw پایدار میمانند تا راهاندازیهای مجدد باعث از دست رفتن زمانبندیها نشوند.
- هنگام ارتقا،
openclaw doctor --fixرا اجرا کنید تا فایلهای قدیمی~/.openclaw/cron/jobs.json،jobs-state.json، وruns/*.jsonlبه SQLite وارد شوند و با پسوند.migratedتغییر نام پیدا کنند. ردیفهای بدشکل کار از زمان اجرا رد میشوند و برای تعمیر یا بررسی بعدی درjobs-quarantine.jsonکپی میشوند. cron.storeهمچنان کلید منطقی فروشگاه Cron و مسیر واردسازی doctor را نامگذاری میکند. پس از واردسازی، ویرایش آن فایل JSON دیگر کارهای فعال Cron را تغییر نمیدهد؛ بهجای آن ازopenclaw cron add|edit|removeیا متدهای RPC مربوط به Cron در Gateway استفاده کنید.- همه اجراهای Cron رکوردهای کار پسزمینه ایجاد میکنند.
- هنگام شروع Gateway، کارهای عقبافتاده گردش عامل ایزوله بهجای بازپخش فوری، بیرون از پنجره اتصال کانال دوباره زمانبندی میشوند تا راهاندازی Discord/Telegram و تنظیم فرمانهای بومی پس از راهاندازی مجدد پاسخگو بمانند.
- کارهای یکباره (
--at) بهطور پیشفرض پس از موفقیت خودکار حذف میشوند. - اجراهای ایزوله Cron پس از تکمیل اجرا، با بهترین تلاش زبانهها/فرایندهای مرورگر ردیابیشده را برای نشست
cron:<jobId>خود میبندند، تا خودکارسازی مرورگر جداشده فرایندهای بیصاحب باقی نگذارد. - اجراهای ایزوله Cron که مجوز محدود خودپاکسازی Cron را دریافت میکنند همچنان میتوانند وضعیت زمانبند، فهرست خودفیلترشدهای از کار فعلی خود، و تاریخچه اجرای همان کار را بخوانند، بنابراین بررسیهای وضعیت/Heartbeat میتوانند بدون دسترسی گستردهتر به تغییر Cron، زمانبندی خودشان را بررسی کنند.
- اجراهای ایزوله Cron همچنین در برابر پاسخهای تأیید قدیمی محافظت میکنند. اگر نتیجه نخست فقط یک بهروزرسانی وضعیت موقت باشد (
on it،pulling everything together، و نشانههای مشابه) و هیچ اجرای فرزند subagent همچنان مسئول پاسخ نهایی نباشد، OpenClaw پیش از تحویل یک بار دیگر برای نتیجه واقعی prompt میدهد. - اجراهای ایزوله Cron از فراداده ساختاریافته رد اجرا از اجرای جاسازیشده استفاده میکنند، از جمله پوششهای node-host با
UNAVAILABLEکه پیام خطای تودرتویشان باSYSTEM_RUN_DENIEDیاINVALID_REQUESTشروع میشود، تا یک فرمان مسدودشده بهعنوان اجرای سبز گزارش نشود، در حالی که نثر عادی دستیار بهعنوان رد اجرا تلقی نشود. - اجراهای ایزوله Cron همچنین شکستهای عامل در سطح اجرا را حتی وقتی هیچ payload پاسخی تولید نشده باشد خطای کار در نظر میگیرند، بنابراین شکستهای مدل/ارائهدهنده شمارندههای خطا را افزایش میدهند و اعلانهای شکست را فعال میکنند، بهجای اینکه کار را موفق پاک کنند.
- وقتی یک کار گردش عامل ایزوله به
timeoutSecondsمیرسد، Cron اجرای عامل زیربنایی را لغو میکند و یک پنجره کوتاه پاکسازی به آن میدهد. اگر اجرا تخلیه نشود، پاکسازی تحت مالکیت Gateway پیش از اینکه Cron وقفه زمانی را ثبت کند، مالکیت نشست آن اجرا را بهاجبار پاک میکند، تا کار چت صفشده پشت یک نشست پردازشی قدیمی جا نماند. - اگر یک گردش عامل ایزوله پیش از شروع runner یا پیش از نخستین فراخوانی مدل متوقف شود، Cron یک وقفه زمانی مخصوص فاز مانند
setup timed out before runner startیاstalled before first model call (last phase: context-engine)ثبت میکند. این watchdogها ارائهدهندگان جاسازیشده و ارائهدهندگان مبتنی بر CLI را پیش از اینکه فرایند CLI خارجی آنها واقعاً شروع شود پوشش میدهند، و مستقل از مقادیر طولانیtimeoutSecondsسقفگذاری میشوند تا شکستهای cold-start/auth/context بهجای انتظار برای کل بودجه کار، سریع آشکار شوند. - اگر از system cron یا زمانبند خارجی دیگری برای اجرای
openclaw agentاستفاده میکنید، آن را با تشدید hard-kill بپیچید، حتی با اینکه CLI،SIGTERM/SIGINTرا مدیریت میکند. اجراهای مبتنی بر Gateway از Gateway میخواهند اجراهای پذیرفتهشده را لغو کند؛ اجراهای محلی و fallback جاسازیشده همان سیگنال لغو را دریافت میکنند. برای GNUtimeout،timeout -k 60 600 openclaw agent ...را بهtimeout 600 ...ساده ترجیح دهید؛ مقدار-kپشتیبان supervisor است اگر فرایند نتواند تخلیه شود. برای واحدهای systemd، همین شکل را با استفاده از سیگنال توقفSIGTERMهمراه با یک پنجره مهلت مانندTimeoutStopSecپیش از هر kill نهایی حفظ کنید. اگر یک تلاش مجدد از--run-idاستفاده کند در حالی که اجرای اصلی Gateway هنوز فعال است، نسخه تکراری بهجای شروع اجرای دوم، درحالاجرا گزارش میشود.
انواع زمانبندی
| نوع | پرچم CLI | توضیح |
|---|---|---|
at |
--at |
مهر زمانی یکباره (ISO 8601 یا نسبی مثل 20m) |
every |
--every |
بازه ثابت |
cron |
--cron |
عبارت Cron پنجفیلدی یا ششفیلدی با --tz اختیاری |
مهرهای زمانی بدون منطقه زمانی بهعنوان UTC در نظر گرفته میشوند. برای زمانبندی بر اساس ساعت محلی، --tz America/New_York را اضافه کنید.
عبارتهای تکرارشونده ابتدای ساعت بهطور خودکار تا ۵ دقیقه پخش میشوند تا جهشهای بار کاهش یابد. برای اجبار زمانبندی دقیق از --exact یا برای یک پنجره صریح از --stagger 30s استفاده کنید.
روز ماه و روز هفته از منطق OR استفاده میکنند
عبارتهای Cron توسط croner تحلیل میشوند. وقتی هر دو فیلد روز ماه و روز هفته غیر wildcard باشند، croner زمانی تطبیق میدهد که هرکدام از فیلدها تطبیق داشته باشد، نه هر دو. این رفتار استاندارد Vixie cron است.
# Intended: "9 AM on the 15th, only if it's a Monday"# Actual: "9 AM on every 15th, AND 9 AM on every Monday"0 9 15 * 1این بهجای ۰ تا ۱ بار در ماه، حدود ۵ تا ۶ بار در ماه اجرا میشود. OpenClaw در اینجا از رفتار پیشفرض OR در Croner استفاده میکند. برای الزام هر دو شرط، از modifier روز هفته + در Croner (0 9 15 * +1) استفاده کنید، یا زمانبندی را روی یک فیلد انجام دهید و فیلد دیگر را در prompt یا فرمان کار خود guard کنید.
سبکهای اجرا
| سبک | مقدار --session |
اجرا در | مناسب برای |
|---|---|---|---|
| نشست اصلی | main |
خط بیدارباش اختصاصی Cron | یادآورها، رویدادهای سیستم |
| ایزوله | isolated |
cron:<jobId> اختصاصی |
گزارشها، کارهای پسزمینه |
| نشست فعلی | current |
مقید در زمان ایجاد | کار تکرارشونده آگاه از زمینه |
| نشست سفارشی | session:custom-id |
نشست نامدار پایدار | گردشکارهایی که بر تاریخچه بنا میشوند |
Main session vs isolated vs custom
کارهای نشست اصلی یک رویداد سیستمی را در خط اجرای تحت مالکیت Cron صف میکنند و بهصورت اختیاری Heartbeat را بیدار میکنند (--wake now یا --wake next-heartbeat). آنها میتوانند از آخرین زمینه تحویل نشست اصلی هدف برای پاسخها استفاده کنند، اما گردشهای معمول Cron را به خط چت انسانی اضافه نمیکنند و تازگی reset روزانه/بیکاری را برای نشست هدف تمدید نمیکنند. کارهای ایزوله یک گردش عامل اختصاصی را با نشست تازه اجرا میکنند. نشستهای سفارشی (session:xxx) زمینه را بین اجراها پایدار نگه میدارند و گردشکارهایی مانند standupهای روزانه را ممکن میکنند که بر خلاصههای قبلی بنا میشوند.
رویدادهای Cron نشست اصلی یادآورهای رویداد سیستمی خودبسنده هستند. آنها
بهطور خودکار دستور "Read HEARTBEAT.md" مربوط به prompt پیشفرض Heartbeat را
شامل نمیشوند. اگر یک یادآور تکرارشونده باید به
HEARTBEAT.md مراجعه کند، آن را صریحاً در متن رویداد Cron یا در
دستورالعملهای خود عامل بگویید.
What 'fresh session' means for isolated jobs
برای کارهای ایزوله، «نشست تازه» یعنی یک شناسه transcript/نشست جدید برای هر اجرا. OpenClaw ممکن است ترجیحهای امنی مانند تنظیمات thinking/fast/verbose، برچسبها، و overrideهای صریحاً انتخابشده توسط کاربر برای مدل/auth را حمل کند، اما زمینه مکالمه محیطی را از یک ردیف Cron قدیمی به ارث نمیبرد: مسیریابی کانال/گروه، سیاست ارسال یا صف، ارتقا، مبدأ، یا binding زمان اجرای ACP. وقتی یک کار تکرارشونده باید عمداً بر همان زمینه مکالمه بنا شود، از current یا session:<id> استفاده کنید.
Runtime cleanup
برای کارهای ایزوله، teardown زمان اجرا اکنون شامل پاکسازی مرورگر با بهترین تلاش برای آن نشست Cron است. شکستهای پاکسازی نادیده گرفته میشوند تا نتیجه واقعی Cron همچنان اولویت داشته باشد.
اجراهای ایزوله Cron همچنین هر نمونه زمان اجرای MCP بستهبندیشدهای را که برای کار ایجاد شده، از مسیر پاکسازی مشترک زمان اجرا dispose میکنند. این با نحوه teardown کلاینتهای MCP در نشست اصلی و نشست سفارشی همخوان است، بنابراین کارهای ایزوله Cron فرایندهای فرزند stdio یا اتصالهای MCP بلندمدت را بین اجراها نشت نمیدهند.
Subagent and Discord delivery
وقتی اجراهای ایزوله Cron، subagentها را هماهنگ میکنند، تحویل نیز خروجی نهایی فرزند را به متن موقت قدیمی والد ترجیح میدهد. اگر فرزندان هنوز در حال اجرا باشند، OpenClaw بهجای اعلام آن، آن بهروزرسانی جزئی والد را سرکوب میکند.
برای هدفهای اعلام Discord فقطمتنی، OpenClaw متن نهایی canonical دستیار را یک بار ارسال میکند، بهجای اینکه هم payloadهای متنی streamed/میانی و هم پاسخ نهایی را بازپخش کند. payloadهای رسانه و ساختاریافته Discord همچنان بهصورت payloadهای جداگانه تحویل داده میشوند تا پیوستها و کامپوننتها حذف نشوند.
payloadهای فرمان
از payloadهای فرمان برای اسکریپتهای قطعی استفاده کنید که باید داخل زمانبند Gateway بدون شروع یک گردش عامل ایزوله مبتنی بر مدل اجرا شوند. کارهای فرمان روی میزبان Gateway اجرا میشوند، stdout/stderr را capture میکنند، اجرا را در تاریخچه Cron ثبت میکنند، و همان حالتهای تحویل announce، webhook، و none را مانند کارهای ایزوله دوباره استفاده میکنند.
openclaw cron create "*/15 * * * *" \ --name "Queue depth probe" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"--command <shell> مقدار argv: ["sh", "-lc", <shell>] را ذخیره میکند. وقتی اجرای دقیق argv را بدون تحلیل shell میخواهید، از --command-argv '["node","scripts/report.mjs"]' استفاده کنید. فیلدهای اختیاری --command-env KEY=VALUE، --command-input، --timeout-seconds، --no-output-timeout-seconds، و --output-max-bytes محیط فرایند، stdin، و حدود خروجی را کنترل میکنند.
اگر stdout خالی نباشد، همان متن نتیجهٔ تحویلشده است. اگر stdout خالی باشد و stderr خالی نباشد، stderr تحویل داده میشود. اگر هر دو جریان وجود داشته باشند، Cron یک بلوک کوچک stdout: / stderr: تحویل میدهد. کد خروج صفر، اجرا را بهصورت ok ثبت میکند؛ خروج غیرصفر، سیگنال، وقفهٔ زمانی، یا وقفهٔ زمانیِ بدون خروجی، error ثبت میکند و میتواند هشدارهای شکست را فعال کند. فرمانی که فقط NO_REPLY چاپ کند، از سرکوب عادی توکنِ بیصدای Cron استفاده میکند و چیزی به چت ارسال نمیکند.
گزینههای بار برای کارهای ایزوله
--messagestringrequiredمتن اعلان؛ برای حالت ایزوله الزامی است.
--modelstringبازنویسی مدل؛ از مدل مجاز انتخابشده برای کار استفاده میکند.
--fallbacksstringفهرست مدلهای پشتیبان برای هر کار، برای نمونه --fallbacks openrouter/gpt-4.1-mini,openai/gpt-5. برای اجرای سختگیرانه بدون پشتیبان، --fallbacks "" را پاس دهید.
--clear-fallbacksbooleanدر cron edit، بازنویسی پشتیبانِ مخصوص کار را حذف میکند تا کار از تقدم پشتیبان پیکربندیشده پیروی کند. نمیتواند با --fallbacks ترکیب شود.
--clear-modelbooleanدر cron edit، بازنویسی مدلِ مخصوص کار را حذف میکند تا کار از تقدم عادی انتخاب مدل Cron پیروی کند؛ اگر بازنویسی ذخیرهشدهٔ نشست Cron تنظیم شده باشد همان، وگرنه مدل عامل/پیشفرض. نمیتواند با --model ترکیب شود.
--thinkingstringبازنویسی سطح تفکر.
--clear-thinkingbooleanدر cron edit، بازنویسی تفکرِ مخصوص کار را حذف میکند تا کار از تقدم عادی تفکر Cron پیروی کند. نمیتواند با --thinking ترکیب شود.
--light-contextbooleanتزریق فایل راهاندازی فضای کاری را رد کن.
--toolsstringابزارهایی را که کار میتواند استفاده کند محدود کن، برای نمونه --tools exec,read.
--model از مدل مجاز انتخابشده بهعنوان مدل اصلی همان کار استفاده میکند. این با بازنویسی /model در نشست چت یکسان نیست: زنجیرههای پشتیبان پیکربندیشده همچنان وقتی مدل اصلی کار شکست بخورد اعمال میشوند. اگر مدل درخواستشده مجاز نباشد یا قابل حل نباشد، Cron بهجای بازگشت بیصدای مدل انتخابی عامل/پیشفرضِ کار، اجرا را با خطای اعتبارسنجی صریح شکست میدهد.
کارهای Cron همچنین میتوانند fallbacks در سطح بار داشته باشند. وقتی وجود داشته باشد، آن فهرست زنجیرهٔ پشتیبان پیکربندیشده برای کار را جایگزین میکند. وقتی اجرای Cron سختگیرانهای میخواهید که فقط مدل انتخابشده را امتحان کند، در بار کار/API از fallbacks: [] استفاده کنید. اگر کاری --model داشته باشد اما نه پشتیبانِ بار و نه پشتیبانِ پیکربندیشده، OpenClaw یک بازنویسی پشتیبانِ خالیِ صریح پاس میدهد تا مدل اصلی عامل بهعنوان هدف تلاش مجددِ اضافی و پنهان افزوده نشود.
بررسیهای پیشپرواز ارائهدهندهٔ محلی پیش از علامتگذاری اجرای Cron بهصورت skipped، پشتیبانهای پیکربندیشده را پیمایش میکنند؛ fallbacks: [] آن مسیر پیشپرواز را سختگیرانه نگه میدارد.
تقدم انتخاب مدل برای کارهای ایزوله چنین است:
- بازنویسی مدل هوک Gmail، وقتی اجرا از Gmail آمده باشد و آن بازنویسی مجاز باشد
modelدر بار مخصوص کار- بازنویسی مدل نشست Cron ذخیرهشدهٔ انتخابشده توسط کاربر
- انتخاب مدل عامل/پیشفرض
حالت سریع نیز از انتخاب زندهٔ حلشده پیروی میکند. اگر پیکربندی مدل انتخابشده params.fastMode داشته باشد، Cron ایزوله بهصورت پیشفرض از آن استفاده میکند. بازنویسی fastMode نشست ذخیرهشده همچنان در هر دو جهت بر پیکربندی مقدم است. حالت خودکار، وقتی موجود باشد، از آستانهٔ params.fastAutoOnSeconds مدل انتخابشده استفاده میکند و پیشفرض آن ۶۰ ثانیه است.
اگر اجرای ایزوله به واگذاریِ تغییر مدل زنده برسد، Cron با ارائهدهنده/مدل تغییریافته دوباره تلاش میکند و پیش از تلاش مجدد، آن انتخاب زنده را برای اجرای فعال پایدار میکند. وقتی تغییر، پروفایل احراز هویت جدیدی هم داشته باشد، Cron بازنویسی آن پروفایل احراز هویت را نیز برای اجرای فعال پایدار میکند. تلاشهای مجدد محدود هستند: پس از تلاش اولیه بهعلاوهٔ ۲ تلاش مجدد تغییر، Cron بهجای حلقهٔ بیپایان متوقف میشود.
پیش از آنکه اجرای Cron ایزوله وارد اجراکنندهٔ عامل شود، OpenClaw نقاط پایانی قابل دسترس ارائهدهندهٔ محلی را برای ارائهدهندههای پیکربندیشدهٔ api: "ollama" و api: "openai-completions" بررسی میکند که baseUrl آنها loopback، شبکهٔ خصوصی، یا .local باشد. اگر آن نقطهٔ پایانی خاموش باشد، اجرا بهجای شروع فراخوانی مدل، بهصورت skipped همراه با خطای روشنِ ارائهدهنده/مدل ثبت میشود. نتیجهٔ نقطهٔ پایانی برای ۵ دقیقه کش میشود، بنابراین کارهای موعددارِ زیادی که از همان سرور محلیِ خاموشِ Ollama، vLLM، SGLang، یا LM Studio استفاده میکنند، بهجای ایجاد طوفان درخواست، یک کاوش کوچک مشترک دارند. اجراهای ردشدهٔ پیشپرواز ارائهدهنده، پسروی خطای اجرا را افزایش نمیدهند؛ وقتی اعلانهای ردشدن تکراری میخواهید، failureAlert.includeSkipped را فعال کنید.
تحویل و خروجی
| حالت | چه اتفاقی میافتد |
|---|---|
announce |
اگر عامل ارسال نکرده باشد، متن نهایی را با پشتیبان به مقصد تحویل میدهد |
webhook |
بار رویداد پایانیافته را به یک URL با POST ارسال میکند |
none |
تحویل پشتیبان اجراکننده ندارد |
برای تحویل کانال، از --announce --channel telegram --to "-1001234567890" استفاده کنید. برای موضوعهای انجمن Telegram، از -1001234567890:topic:123 استفاده کنید؛ OpenClaw همچنین کوتاهنویسی متعلق به Telegram یعنی -1001234567890:123 را میپذیرد. فراخوانندههای مستقیم RPC/پیکربندی میتوانند delivery.threadId را بهصورت رشته یا عدد پاس دهند. مقصدهای Slack/Discord/Mattermost باید از پیشوندهای صریح استفاده کنند (channel:<id>، user:<id>). شناسههای اتاق Matrix به بزرگی و کوچکی حروف حساساند؛ از شناسهٔ دقیق اتاق یا قالب room:!room:server از Matrix استفاده کنید.
وقتی تحویل اعلام از channel: "last" استفاده میکند یا channel را حذف میکند، مقصدی با پیشوند ارائهدهنده مانند telegram:123 میتواند پیش از بازگشت Cron به تاریخچهٔ نشست یا یک کانال پیکربندیشده، کانال را انتخاب کند. فقط پیشوندهایی که Plugin بارگذاریشده اعلام کرده است انتخابگر ارائهدهنده هستند. اگر delivery.channel صریح باشد، پیشوند مقصد باید همان ارائهدهنده را نام ببرد؛ برای نمونه، channel: "whatsapp" همراه با to: "telegram:123" رد میشود، نه اینکه به WhatsApp اجازه داده شود شناسهٔ Telegram را بهعنوان شماره تلفن تفسیر کند. پیشوندهای نوع مقصد و سرویس مانند channel:<id>، user:<id>، imessage:<handle>، و sms:<number> همچنان نحو مقصد متعلق به کانال هستند، نه انتخابگر ارائهدهنده.
برای کارهای ایزوله، تحویل چت مشترک است. اگر مسیر چت در دسترس باشد، عامل میتواند حتی وقتی کار از --no-deliver استفاده میکند، از ابزار message استفاده کند. اگر عامل به مقصد پیکربندیشده/فعلی ارسال کند، OpenClaw اعلام پشتیبان را رد میکند. در غیر این صورت announce، webhook، و none فقط کنترل میکنند اجراکننده پس از نوبت عامل با پاسخ نهایی چه کند.
وقتی عاملی از یک چت فعال یادآور ایزوله ایجاد میکند، OpenClaw مقصد تحویل زندهٔ حفظشده را برای مسیر اعلام پشتیبان ذخیره میکند. کلیدهای نشست داخلی ممکن است حروف کوچک باشند؛ وقتی زمینهٔ چت فعلی در دسترس است، مقصدهای تحویل ارائهدهنده از آن کلیدها بازسازی نمیشوند.
تحویل اعلام ضمنی از فهرستهای مجاز کانال پیکربندیشده برای اعتبارسنجی و مسیردهی دوبارهٔ مقصدهای کهنه استفاده میکند. تأییدهای انبار جفتسازی پیام مستقیم، گیرندگان اتوماسیون پشتیبان نیستند؛ وقتی یک کار زمانبندیشده باید فعالانه به یک پیام مستقیم ارسال کند، delivery.to را تنظیم کنید یا ورودی allowFrom کانال را پیکربندی کنید.
زبان خروجی
کارهای Cron زبان پاسخ را از کانال، محل، یا پیامهای قبلی استنباط نمیکنند. قانون زبان را در پیام زمانبندیشده یا الگو بگذارید:
openclaw cron edit <jobId> \ --message "Summarize the updates. Respond in Chinese; keep URLs, code, and product names unchanged."برای فایلهای الگو، دستور زبان را در اعلان رندرشده نگه دارید و پیش از اجرای کار بررسی کنید جاینگهدارهایی مانند {{language}} پر شده باشند. اگر خروجی زبانها را ترکیب میکند، قانون را صریح کنید، برای نمونه: "Use Chinese for narrative text and keep technical terms in English."
اعلانهای شکست از مسیر مقصد جداگانهای پیروی میکنند:
cron.failureDestinationیک پیشفرض جهانی برای اعلانهای شکست تنظیم میکند.job.delivery.failureDestinationآن را برای هر کار بازنویسی میکند.- اگر هیچکدام تنظیم نشده باشد و کار از پیش از طریق
announceتحویل بدهد، اعلانهای شکست اکنون به همان مقصد اعلام اصلی بازمیگردند. delivery.failureDestinationفقط روی کارهایsessionTarget="isolated"پشتیبانی میشود، مگر اینکه حالت تحویل اصلیwebhookباشد.failureAlert.includeSkipped: trueیک کار یا سیاست هشدار Cron جهانی را وارد هشدارهای تکراریِ اجرای ردشده میکند. اجراهای ردشده شمارندهٔ ردشدن متوالی جداگانهای دارند، بنابراین بر پسروی خطای اجرا اثر نمیگذارند.
نمونههای CLI
یادآور یکباره
openclaw cron add \ --name "Calendar check" \ --at "20m" \ --session main \ --system-event "Next heartbeat: check calendar." \ --wake nowکار ایزولهٔ تکرارشونده
openclaw cron create "0 7 * * *" \ "Summarize overnight updates." \ --name "Morning brief" \ --tz "America/Los_Angeles" \ --session isolated \ --announce \ --channel slack \ --to "channel:C1234567890"بازنویسی مدل و تفکر
openclaw cron add \ --name "Deep analysis" \ --cron "0 6 * * 1" \ --tz "America/Los_Angeles" \ --session isolated \ --message "Weekly deep analysis of project progress." \ --model "opus" \ --thinking high \ --announceخروجی Webhook
openclaw cron create "0 18 * * 1-5" \ "Summarize today's deploys as JSON." \ --name "Deploy digest" \ --webhook "https://example.invalid/openclaw/cron"خروجی فرمان
openclaw cron create "*/15 * * * *" \ --name "Queue depth probe" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"Webhookها
Gateway میتواند نقاط پایانی HTTP Webhook را برای محرکهای خارجی در معرض بگذارد. در پیکربندی فعال کنید:
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", },}احراز هویت
هر درخواست باید توکن هوک را از طریق سرآیند شامل کند:
Authorization: Bearer <token>؛ توصیهشدهx-openclaw-token: <token>
توکنهای رشتهٔ پرسوجو رد میشوند.
POST /hooks/wake
یک رویداد سامانه را برای نشست اصلی در صف بگذارید:
curl -X POST http://127.0.0.1:18789/hooks/wake \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"text":"New email received","mode":"now"}'textstringrequiredشرح رویداد.
modestringdefault: nownow یا next-heartbeat.
POST /hooks/agent
یک نوبت عامل ایزوله را اجرا کنید:
curl -X POST http://127.0.0.1:18789/hooks/agent \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.4"}'فیلدها: message؛ الزامی، name، agentId، wakeMode، deliver، channel، to، model، fallbacks، thinking، timeoutSeconds.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSLZh9mI2qnigIzZh9in24wg2Ybar9in2LTYquKAjNi02K_ZhyAoUE9TVCAvaG9va3MvPG5hbWU
)">
نامهای سفارشی هوک از طریق hooks.mappings در پیکربندی حل میشوند. نگاشتها میتوانند بارهای دلخواه را با الگوها یا تبدیلهای کد به کنشهای wake یا agent تبدیل کنند.
یکپارچهسازی Gmail PubSub
محرکهای صندوق ورودی Gmail را از طریق Google PubSub به OpenClaw وصل کنید.
راهاندازی جادوگر (توصیهشده)
openclaw webhooks gmail setup --account openclaw@gmail.comاین پیکربندی hooks.gmail را مینویسد، پیشتنظیم Gmail را فعال میکند، و از Tailscale Funnel برای نقطه پایانی push استفاده میکند.
شروع خودکار Gateway
وقتی hooks.enabled=true باشد و hooks.gmail.account تنظیم شده باشد، Gateway هنگام راهاندازی gog gmail watch serve را شروع میکند و ناظر را بهطور خودکار تمدید میکند. برای انصراف، OPENCLAW_SKIP_GMAIL_WATCHER=1 را تنظیم کنید.
راهاندازی دستی یکباره
انتخاب پروژه GCP
پروژه GCP مالک کلاینت OAuth مورد استفاده gog را انتخاب کنید:
gcloud auth logingcloud config set project <project-id>gcloud services enable gmail.googleapis.com pubsub.googleapis.comایجاد topic و اعطای دسترسی push به Gmail
gcloud pubsub topics create gog-gmail-watchgcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \ --role=roles/pubsub.publisherشروع ناظر
gog gmail watch start \ --account openclaw@gmail.com \ --label INBOX \ --topic projects/<project-id>/topics/gog-gmail-watchبازنویسی مدل Gmail
{ hooks: { gmail: { model: "openrouter/meta-llama/llama-3.3-70b-instruct:free", thinking: "off", }, },}مدیریت کارها
# List all jobsopenclaw cron list # Get one stored job as JSONopenclaw cron get <jobId> # Show one job, including resolved delivery routeopenclaw cron show <jobId> # Edit a jobopenclaw cron edit <jobId> --message "Updated prompt" --model "opus" # Force run a job nowopenclaw cron run <jobId> # Force run a job now and wait for its terminal statusopenclaw cron run <jobId> --wait --wait-timeout 10m --poll-interval 2s # Run only if dueopenclaw cron run <jobId> --due # View run historyopenclaw cron runs --id <jobId> --limit 50 # View one exact runopenclaw cron runs --id <jobId> --run-id <runId> # Delete a jobopenclaw cron remove <jobId> # Agent selection (multi-agent setups)openclaw cron create "0 6 * * *" "Check ops queue" --name "Ops sweep" --session isolated --agent opsopenclaw cron edit <jobId> --clear-agentopenclaw cron run <jobId> پس از صفکردن اجرای دستی برمیگردد. برای قلابهای خاموشسازی، اسکریپتهای نگهداری، یا خودکارسازی دیگری که باید تا پایان اجرای صفشده مسدود بماند، از --wait استفاده کنید. حالت انتظار دقیقاً همان runId بازگشتی را نظرسنجی میکند؛ برای وضعیت ok با 0 خارج میشود و برای error، skipped، یا پایان مهلت انتظار با مقدار غیرصفر.
ابزار عامل cron خلاصههای فشرده کار (id، name، enabled، nextRunAtMs، scheduleKind، lastRunStatus) را از cron(action: "list") برمیگرداند؛ برای تعریف کامل یک کار از cron(action: "get", jobId: "...") استفاده کنید. فراخوانندههای مستقیم Gateway میتوانند compact: true را به cron.list بدهند؛ حذف آن پاسخ کامل موجود را با پیشنمایشهای تحویل حفظ میکند.
openclaw cron create نام مستعار openclaw cron add است، و کارهای جدید میتوانند از یک زمانبندی مکانی ("0 9 * * 1"، "every 1h"، "20m"، یا یک timestamp با ISO) و پس از آن یک پیام عامل مکانی استفاده کنند. روی cron add|create یا cron edit از --webhook <url> استفاده کنید تا محموله اجرای پایانیافته به یک نقطه پایانی HTTP با POST ارسال شود. تحویل Webhook را نمیتوان با پرچمهای تحویل چت مانند --announce، --channel، --to، --thread-id، یا --account ترکیب کرد. در cron edit، --clear-channel، --clear-to، --clear-thread-id، و --clear-account آن فیلدهای مسیریابی را بهصورت جداگانه unset میکنند (هرکدام همراه با پرچم تنظیم متناظر خود رد میشود)، که با غیرفعالکردن تحویل fallback اجراکننده توسط --no-deliver تفاوت دارد.
پیکربندی
{ cron: { enabled: true, store: "~/.openclaw/cron/jobs.json", maxConcurrentRuns: 8, retry: { maxAttempts: 3, backoffMs: [60000, 120000, 300000], retryOn: ["rate_limit", "overloaded", "network", "server_error"], }, webhookToken: "replace-with-dedicated-webhook-token", sessionRetention: "24h", runLog: { maxBytes: "2mb", keepLines: 2000 }, },}maxConcurrentRuns هم ارسال Cron زمانبندیشده و هم اجرای نوبت عامل ایزوله را محدود میکند، و مقدار پیشفرض آن 8 است. نوبتهای عامل Cron ایزوله بهصورت داخلی از مسیر اجرای اختصاصی cron-nested صف استفاده میکنند، بنابراین افزایش این مقدار باعث میشود اجراهای مستقل LLM در Cron بهجای اینکه فقط wrapperهای بیرونی Cron خود را شروع کنند، بهصورت موازی پیش بروند. مسیر مشترک غیر-Cron nested با این تنظیم گسترش داده نمیشود.
cron.store یک کلید ذخیره منطقی و مسیر ورود doctor قدیمی است. برای واردکردن storeهای JSON موجود به SQLite و بایگانی آنها، openclaw doctor --fix را اجرا کنید؛ تغییرات آینده Cron باید از طریق CLI یا API Gateway انجام شوند.
غیرفعالکردن Cron: cron.enabled: false یا OPENCLAW_SKIP_CRON=1.
رفتار تلاش دوباره
تلاش دوباره یکباره: خطاهای گذرا (rate limit، overload، network، server error) تا 3 بار با backoff نمایی دوباره تلاش میشوند. خطاهای دائمی فوراً غیرفعال میشوند.
تلاش دوباره تکرارشونده: backoff نمایی (30s تا 60m) بین تلاشهای دوباره. backoff پس از اجرای موفق بعدی بازنشانی میشود.
نگهداری
cron.sessionRetention (پیشفرض 24h) ورودیهای نشست اجرای ایزوله را هرس میکند. cron.runLog.keepLines ردیفهای تاریخچه اجرای SQLite نگهداریشده برای هر کار را محدود میکند؛ maxBytes برای سازگاری پیکربندی با گزارشهای اجرای قدیمی متکی بر فایل حفظ شده است.
عیبیابی
نردبان فرمانها
openclaw statusopenclaw gateway statusopenclaw cron statusopenclaw cron listopenclaw cron runs --id <jobId> --limit 20openclaw system heartbeat lastopenclaw logs --followopenclaw doctorCron اجرا نمیشود
- متغیر محیطی
cron.enabledوOPENCLAW_SKIP_CRONرا بررسی کنید. - تأیید کنید که Gateway بهصورت پیوسته در حال اجراست.
- برای زمانبندیهای
cron، timezone (--tz) را در برابر timezone میزبان بررسی کنید. reason: not-dueدر خروجی اجرا یعنی اجرای دستی باopenclaw cron run <jobId> --dueبررسی شد و زمان انجام کار هنوز نرسیده بود.
Cron اجرا شد اما تحویلی انجام نشد
- حالت تحویل
noneیعنی ارسال fallback اجراکننده انتظار نمیرود. عامل همچنان میتواند وقتی مسیر چت موجود است، مستقیماً با ابزارmessageارسال کند. - هدف تحویل گمشده/نامعتبر (
channel/to) یعنی خروجی رد شد. - برای Matrix، کارهای کپیشده یا قدیمی با شناسههای اتاق
delivery.toکه کوچکحرف شدهاند ممکن است ناموفق شوند، چون شناسههای اتاق Matrix به بزرگی و کوچکی حروف حساس هستند. کار را به مقدار دقیق!room:serverیاroom:!room:serverاز Matrix ویرایش کنید. - خطاهای احراز هویت کانال (
unauthorized،Forbidden) یعنی تحویل بهدلیل اعتبارنامهها مسدود شد. - اگر اجرای ایزوله فقط توکن بیصدا (
NO_REPLY/no_reply) را برگرداند، OpenClaw تحویل خروجی مستقیم را سرکوب میکند و مسیر خلاصه صفشده fallback را نیز سرکوب میکند، بنابراین چیزی به چت ارسال نمیشود. - اگر عامل باید خودش به کاربر پیام بدهد، بررسی کنید که کار یک مسیر قابلاستفاده دارد (
channel: "last"با یک چت قبلی، یا کانال/هدف صریح).
به نظر میرسد Cron یا heartbeat از rollover سبک /new جلوگیری میکند
- تازگی بازنشانی روزانه و بیکار مبتنی بر
updatedAtنیست؛ مدیریت نشست را ببینید. - بیدارباشهای Cron، اجراهای Heartbeat، اعلانهای exec، و دفترداری gateway ممکن است ردیف نشست را برای مسیریابی/وضعیت بهروزرسانی کنند، اما
sessionStartedAtیاlastInteractionAtرا تمدید نمیکنند. - برای ردیفهای قدیمی ایجادشده پیش از وجود این فیلدها، OpenClaw میتواند
sessionStartedAtرا از سرآیند نشست transcript JSONL بازیابی کند، وقتی فایل هنوز موجود باشد. ردیفهای بیکار قدیمی بدونlastInteractionAtاز همان زمان شروع بازیابیشده بهعنوان مبنای بیکاری خود استفاده میکنند.
نکات مهم timezone
- Cron بدون
--tzاز timezone میزبان gateway استفاده میکند. - زمانبندیهای
atبدون timezone بهعنوان UTC در نظر گرفته میشوند. activeHoursدر Heartbeat از resolve کردن timezone پیکربندیشده استفاده میکند.
مرتبط
- خودکارسازی — همه سازوکارهای خودکارسازی در یک نگاه
- کارهای پسزمینه — دفتر کارها برای اجراهای Cron
- Heartbeat — نوبتهای دورهای نشست اصلی
- Timezone — پیکربندی timezone