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، وتلميحات مشابهة) ولم يعد أي تشغيل وكيل فرعي تابع مسؤولًا عن الإجابة النهائية، يعيد OpenClaw المطالبة مرة واحدة للحصول على النتيجة الفعلية قبل التسليم. - تستخدم تشغيلات cron المعزولة بيانات وصفية منظمة لرفض التنفيذ من التشغيل المضمن، بما في ذلك أغلفة node-host
UNAVAILABLEالتي تبدأ رسالة الخطأ المتداخلة فيها بـSYSTEM_RUN_DENIEDأوINVALID_REQUEST، بحيث لا يُبلّغ عن أمر محظور كتشغيل ناجح، بينما لا يُعامل نثر المساعد العادي كرفض. - تتعامل تشغيلات cron المعزولة أيضًا مع إخفاقات الوكيل على مستوى التشغيل كأخطاء مهام حتى عندما لا تُنتج حمولة رد، بحيث تزيد إخفاقات النموذج/المزوّد عدادات الأخطاء وتطلق إشعارات الفشل بدلًا من اعتبار المهمة ناجحة.
- عندما تصل مهمة دورة وكيل معزولة إلى
timeoutSeconds، يجهض cron تشغيل الوكيل الأساسي ويمنحه نافذة تنظيف قصيرة. إذا لم يُفرّغ التشغيل، فإن التنظيف المملوك لـ Gateway يزيل قسرًا ملكية جلسة ذلك التشغيل قبل أن يسجل cron انتهاء المهلة، حتى لا يبقى عمل الدردشة المنتظر خلف جلسة معالجة قديمة. - إذا توقفت دورة وكيل معزولة قبل بدء المشغل أو قبل أول استدعاء للنموذج، يسجل cron انتهاء مهلة خاصًا بالمرحلة مثل
setup timed out before runner startأوstalled before first model call (last phase: context-engine). تغطي هذه المراقبات المزوّدين المضمنين والمزوّدين المدعومين بـ CLI قبل بدء عملية CLI الخارجية فعليًا، وتُحدد بسقوف مستقلة عن قيمtimeoutSecondsالطويلة حتى تظهر إخفاقات البدء البارد/المصادقة/السياق بسرعة بدلًا من انتظار ميزانية المهمة الكاملة. - إذا كنت تستخدم cron النظامي أو مجدولًا خارجيًا آخر لتشغيل
openclaw agent، فغلّفه بتصعيد قتل صارم حتى لو كان CLI يتعامل معSIGTERM/SIGINT. تطلب التشغيلات المدعومة بـ Gateway من Gateway إجهاض التشغيلات المقبولة؛ وتتلقى تشغيلات الرجوع المحلية والمضمنة إشارة الإجهاض نفسها. بالنسبة إلى GNUtimeout، فضّلtimeout -k 60 600 openclaw agent ...علىtimeout 600 ...فقط؛ فقيمة-kهي مسند المشرف إذا تعذر تفريغ العملية. بالنسبة إلى وحدات systemd، حافظ على الشكل نفسه باستخدام إشارة إيقافSIGTERMمع نافذة سماح مثلTimeoutStopSecقبل أي قتل نهائي. إذا أعادت محاولة استخدام--run-idبينما ما زال تشغيل Gateway الأصلي نشطًا، يُبلّغ عن النسخة المكررة على أنها قيد التنفيذ بدلًا من بدء تشغيل ثانٍ.
أنواع الجداول
| النوع | علم CLI | الوصف |
|---|---|---|
at |
--at |
طابع زمني لمرة واحدة (ISO 8601 أو نسبي مثل 20m) |
every |
--every |
فاصل ثابت |
cron |
--cron |
تعبير cron من 5 حقول أو 6 حقول مع --tz اختياري |
تُعامل الطوابع الزمنية من دون منطقة زمنية على أنها UTC. أضف --tz America/New_York للجدولة حسب وقت الحائط المحلي.
تُزاح تعبيرات التكرار عند رأس الساعة تلقائيًا بما يصل إلى 5 دقائق لتقليل ذروات الحمل. استخدم --exact لفرض توقيت دقيق أو --stagger 30s لنافذة صريحة.
يستخدم يوم الشهر ويوم الأسبوع منطق OR
تُحلل تعبيرات Cron بواسطة croner. عندما لا يكون حقلا يوم الشهر ويوم الأسبوع حرفي بدل، يطابق 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ينطلق هذا نحو 5-6 مرات في الشهر بدلًا من 0-1 مرة في الشهر. يستخدم OpenClaw هنا سلوك OR الافتراضي في Croner. لاشتراط تحقق الشرطين، استخدم معدّل يوم الأسبوع + في Croner (0 9 15 * +1) أو جدوِل على أحد الحقلين واحرس الآخر في مطالبة مهمتك أو أمرها.
أنماط التنفيذ
| النمط | قيمة --session |
يعمل في | الأنسب لـ |
|---|---|---|---|
| الجلسة الرئيسية | main |
مسار إيقاظ cron مخصص | التذكيرات، أحداث النظام |
| معزول | isolated |
cron:<jobId> مخصص |
التقارير، الأعمال الخلفية |
| الجلسة الحالية | current |
مرتبط عند وقت الإنشاء | العمل المتكرر الواعي بالسياق |
| جلسة مخصصة | session:custom-id |
جلسة مسماة مستمرة | سير العمل الذي يبني على السجل |
Main session vs isolated vs custom
تضيف مهام الجلسة الرئيسية حدث نظام إلى مسار تشغيل مملوك لـ cron وتوقظ Heartbeat اختياريًا (--wake now أو --wake next-heartbeat). يمكنها استخدام آخر سياق تسليم للجلسة الرئيسية المستهدفة للردود، لكنها لا تضيف دورات cron الروتينية إلى مسار دردشة الإنسان ولا تمدد حداثة إعادة الضبط اليومية/الخاملة للجلسة المستهدفة. تعمل المهام المعزولة كدورة وكيل مخصصة مع جلسة جديدة. تحتفظ الجلسات المخصصة (session:xxx) بالسياق عبر التشغيلات، مما يتيح سير عمل مثل الاجتماعات اليومية التي تبني على الملخصات السابقة.
أحداث cron للجلسة الرئيسية هي تذكيرات أحداث نظام قائمة بذاتها. إنها لا
تتضمن تلقائيًا تعليمة مطالبة Heartbeat الافتراضية "Read
HEARTBEAT.md". إذا كان ينبغي لتذكير متكرر الرجوع إلى
HEARTBEAT.md، فاذكر ذلك صراحة في نص حدث cron أو في
تعليمات الوكيل نفسه.
What 'fresh session' means for isolated jobs
بالنسبة إلى المهام المعزولة، تعني "الجلسة الجديدة" معرف نسخة/جلسة جديدًا لكل تشغيل. قد يحمل OpenClaw تفضيلات آمنة مثل إعدادات التفكير/السرعة/الإسهاب، والتسميات، وتجاوزات النموذج/المصادقة المختارة صراحة من المستخدم، لكنه لا يرث سياق محادثة محيطًا من صف cron أقدم: توجيه القناة/المجموعة، وسياسة الإرسال أو قائمة الانتظار، والرفع، والأصل، أو ربط وقت تشغيل ACP. استخدم current أو session:<id> عندما ينبغي لمهمة متكررة أن تبني عمدًا على سياق المحادثة نفسه.
Runtime cleanup
بالنسبة إلى المهام المعزولة، يتضمن تفكيك وقت التشغيل الآن تنظيفًا للمتصفح، قدر الإمكان، لجلسة cron تلك. يتم تجاهل إخفاقات التنظيف حتى تبقى نتيجة cron الفعلية هي الحاسمة.
تتخلص تشغيلات cron المعزولة أيضًا من أي نُسخ وقت تشغيل MCP مضمّنة أُنشئت للمهمة عبر مسار تنظيف وقت التشغيل المشترك. يطابق هذا طريقة تفكيك عملاء MCP للجلسة الرئيسية والجلسة المخصصة، بحيث لا تُسرّب مهام cron المعزولة عمليات فرعية عبر stdio أو اتصالات MCP طويلة العمر عبر التشغيلات.
Subagent and Discord delivery
عندما تنسق تشغيلات cron المعزولة وكلاء فرعيين، يفضل التسليم أيضًا مخرج التابع النهائي على النص المؤقت القديم من الأصل. إذا كانت التوابع ما زالت قيد التشغيل، يكتم OpenClaw ذلك التحديث الجزئي من الأصل بدلًا من إعلانه.
بالنسبة إلى أهداف إعلان Discord النصية فقط، يرسل OpenClaw نص المساعد النهائي القانوني مرة واحدة بدلًا من إعادة تشغيل كل من حمولات النص المتدفقة/الوسيطة والإجابة النهائية. ما زال يتم تسليم وسائط وحمولات Discord المنظمة كحمولات منفصلة حتى لا تُسقط المرفقات والمكونات.
حمولات الأوامر
استخدم حمولات الأوامر للسكربتات الحتمية التي ينبغي أن تعمل داخل مجدول Gateway دون بدء دورة وكيل معزولة مدعومة بنموذج. تُنفذ مهام الأوامر على مضيف Gateway، وتلتقط stdout/stderr، وتسجل التشغيل في سجل 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>]. استخدم --command-argv '["node","scripts/report.mjs"]' عندما تريد تنفيذ argv دقيقًا دون تحليل shell. تتحكم الحقول الاختيارية --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 على مستوى الحمولة. عند وجودها، تستبدل تلك القائمة سلسلة الاحتياطي المكوّنة للمهمة. استخدم fallbacks: [] في حمولة المهمة/API عندما تريد تشغيل Cron صارمًا يجرّب النموذج المحدد فقط. إذا كانت المهمة تحتوي على --model ولكن لا توجد احتياطيات في الحمولة ولا احتياطيات مكوّنة، يمرّر OpenClaw تجاوز احتياطي فارغًا صريحًا حتى لا يُضاف النموذج الأساسي للوكيل كهدف إعادة محاولة إضافي مخفي.
تفحص اختبارات التمهيد المسبق للمزوّد المحلي الاحتياطيات المكوّنة قبل وسم تشغيل Cron بأنه skipped؛ يبقي fallbacks: [] مسار التمهيد المسبق هذا صارمًا.
أسبقية اختيار النموذج للمهام المعزولة هي:
- تجاوز نموذج ربط Gmail (عندما يأتي التشغيل من Gmail ويكون ذلك التجاوز مسموحًا)
modelفي حمولة كل مهمة- تجاوز نموذج جلسة Cron المخزّن المحدد من المستخدم
- اختيار نموذج الوكيل/الافتراضي
يتبع الوضع السريع الاختيار الحي المحلول أيضًا. إذا كان تكوين النموذج المحدد يحتوي على params.fastMode، يستخدمه Cron المعزول افتراضيًا. يظل تجاوز fastMode لجلسة مخزّنة متقدمًا على التكوين في كلا الاتجاهين. يستخدم الوضع التلقائي حد params.fastAutoOnSeconds للنموذج المحدد عند وجوده، ويكون الافتراضي 60 ثانية.
إذا صادف تشغيل معزول تسليم تبديل نموذج حي، يعيد cron المحاولة بالمزوّد/النموذج الذي تم التبديل إليه ويحفظ ذلك الاختيار الحي للتشغيل النشط قبل إعادة المحاولة. عندما يحمل التبديل أيضًا ملف تعريف مصادقة جديدًا، يحفظ cron تجاوز ملف تعريف المصادقة ذلك للتشغيل النشط أيضًا. إعادة المحاولات محدودة: بعد المحاولة الأولية إضافة إلى محاولتي تبديل، يُجهض cron بدل الدوران إلى الأبد.
قبل أن يدخل تشغيل Cron معزول إلى مشغّل الوكيل، يتحقق OpenClaw من نقاط نهاية المزوّدين المحليين القابلة للوصول للمزوّدين المكوّنين api: "ollama" وapi: "openai-completions" الذين يكون baseUrl لديهم local loopback أو شبكة خاصة أو .local. إذا كانت نقطة النهاية تلك متوقفة، يُسجّل التشغيل على أنه skipped مع خطأ واضح للمزوّد/النموذج بدل بدء استدعاء نموذج. تُخزّن نتيجة نقطة النهاية مؤقتًا لمدة 5 دقائق، لذلك تشترك عدة مهام مستحقة تستخدم خادم Ollama أو vLLM أو SGLang أو LM Studio المحلي نفسه المتوقف في مسبار صغير واحد بدل إنشاء عاصفة طلبات. لا تزيد عمليات التشغيل التي تم تخطيها في تمهيد المزوّد المسبق تراجع أخطاء التنفيذ؛ فعّل failureAlert.includeSkipped عندما تريد إشعارات تخطٍّ متكررة.
التسليم والمخرجات
| الوضع | ما يحدث |
|---|---|
announce |
تسليم احتياطي للنص النهائي إلى الهدف إذا لم يرسل الوكيل |
webhook |
POST حمولة حدث الانتهاء إلى URL |
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> صيغة أهداف مملوكة للقناة، وليست محددات مزوّد.
بالنسبة للمهام المعزولة، يكون تسليم الدردشة مشتركًا. إذا كان مسار دردشة متاحًا، يمكن للوكيل استخدام أداة message حتى عندما تستخدم المهمة --no-deliver. إذا أرسل الوكيل إلى الهدف المكوّن/الحالي، يتخطى 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
One-shot reminder
openclaw cron add \ --name "Calendar check" \ --at "20m" \ --session main \ --system-event "Next heartbeat: check calendar." \ --wake nowRecurring isolated job
openclaw cron create "0 7 * * *" \ "Summarize overnight updates." \ --name "Morning brief" \ --tz "America/Los_Angeles" \ --session isolated \ --announce \ --channel slack \ --to "channel:C1234567890"Model and thinking override
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 \ --announceWebhook output
openclaw cron create "0 18 * * 1-5" \ "Summarize today's deploys as JSON." \ --name "Deploy digest" \ --webhook "https://example.invalid/openclaw/cron"Command output
openclaw cron create "*/15 * * * *" \ --name "Queue depth probe" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"Webhooks
يمكن لـ Gateway كشف نقاط نهاية Webhook عبر HTTP للمشغلات الخارجية. فعّلها في التكوين:
{ 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:IHRpdGxlPSJNYXBwZWQgaG9va3MgKFBPU1QgL2hvb2tzLzxuYW1l
)">
تُحل أسماء الروابط المخصصة عبر hooks.mappings في التكوين. يمكن للتعيينات تحويل أي حمولات إلى إجراءات wake أو agent باستخدام قوالب أو تحويلات برمجية.
تكامل Gmail PubSub
اربط مشغّلات صندوق وارد Gmail بـ OpenClaw عبر Google PubSub.
إعداد المعالج (موصى به)
openclaw webhooks gmail setup --account openclaw@gmail.comيكتب هذا إعدادات hooks.gmail، ويفعّل الإعداد المسبق لـ Gmail، ويستخدم Tailscale Funnel لنقطة نهاية الدفع.
بدء 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إنشاء موضوع ومنح 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", }, },}إدارة المهام
# سرد كل المهامopenclaw cron list # جلب مهمة واحدة مخزنة بصيغة JSONopenclaw cron get <jobId> # عرض مهمة واحدة، بما في ذلك مسار التسليم المحلولopenclaw cron show <jobId> # تعديل مهمةopenclaw cron edit <jobId> --message "Updated prompt" --model "opus" # فرض تشغيل مهمة الآنopenclaw cron run <jobId> # فرض تشغيل مهمة الآن وانتظار حالتها النهائيةopenclaw cron run <jobId> --wait --wait-timeout 10m --poll-interval 2s # التشغيل فقط إذا كان موعدها قد حانopenclaw cron run <jobId> --due # عرض سجل التشغيلopenclaw cron runs --id <jobId> --limit 50 # عرض تشغيل محدد بدقةopenclaw cron runs --id <jobId> --run-id <runId> # حذف مهمةopenclaw cron remove <jobId> # اختيار الوكيل (إعدادات متعددة الوكلاء)openclaw cron create "0 6 * * *" "Check ops queue" --name "Ops sweep" --session isolated --agent opsopenclaw cron edit <jobId> --clear-agentيعيد openclaw cron run <jobId> بعد وضع التشغيل اليدوي في الصف. استخدم --wait لخطّافات الإيقاف، أو سكربتات الصيانة، أو أي أتمتة أخرى يجب أن تحجب التنفيذ حتى ينتهي التشغيل الموجود في الصف. يستطلع وضع الانتظار runId المُعاد بدقة؛ ويخرج بالقيمة 0 للحالة ok وبقيمة غير صفرية للحالات 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" أو طابع زمني ISO) يليها موجّه وكيل موضعي. استخدم --webhook <url> على cron add|create أو cron edit لإرسال حمولة التشغيل المكتمل بطريقة POST إلى نقطة نهاية HTTP. لا يمكن جمع تسليم Webhook مع أعلام تسليم الدردشة مثل --announce أو --channel أو --to أو --thread-id أو --account. في cron edit، تلغي --clear-channel و--clear-to و--clear-thread-id و--clear-account ضبط حقول التوجيه هذه كلٌّ على حدة (ويُرفض كل منها مع علم الضبط المطابق له)، وهذا يختلف عن تعطيل --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 والمستقلة بالتقدم بالتوازي بدلًا من الاكتفاء ببدء أغلفة Cron الخارجية. لا يوسّع هذا الإعداد مسار nested المشترك غير الخاص بـ Cron.
cron.store هو مفتاح مخزن منطقي ومسار استيراد قديم عبر doctor. شغّل openclaw doctor --fix لاستيراد مخازن JSON الحالية إلى SQLite وأرشفتها؛ وينبغي أن تمر تغييرات Cron المستقبلية عبر CLI أو API Gateway.
تعطيل Cron: cron.enabled: false أو OPENCLAW_SKIP_CRON=1.
سلوك إعادة المحاولة
إعادة محاولة لمرة واحدة: يُعاد محاولة الأخطاء العابرة (حد المعدل، الحمل الزائد، الشبكة، خطأ الخادم) حتى 3 مرات مع تراجع أسي. تؤدي الأخطاء الدائمة إلى التعطيل فورًا.
إعادة محاولة متكررة: تراجع أسي (من 30ث إلى 60د) بين المحاولات. يُعاد ضبط التراجع بعد التشغيل الناجح التالي.
الصيانة
يزيل 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، تحقق من المنطقة الزمنية (--tz) مقابل المنطقة الزمنية للمضيف. - يعني
reason: not-dueفي مخرجات التشغيل أن التشغيل اليدوي فُحص باستخدامopenclaw cron run <jobId> --dueوأن موعد المهمة لم يحن بعد.
Cron بدأ لكن بلا تسليم
- يعني وضع التسليم
noneأنه لا يُتوقع إرسال رجوع احتياطي من المشغّل. لا يزال بإمكان الوكيل الإرسال مباشرة باستخدام أداةmessageعند توفر مسار دردشة. - يعني هدف التسليم المفقود/غير الصالح (
channel/to) أن الإرسال الصادر تم تخطيه. - بالنسبة إلى Matrix، يمكن أن تفشل المهام المنسوخة أو القديمة ذات معرّفات غرف
delivery.toالمكتوبة بأحرف صغيرة لأن معرّفات غرف Matrix حساسة لحالة الأحرف. عدّل المهمة إلى قيمة!room:serverأوroom:!room:serverالدقيقة من Matrix. - تعني أخطاء مصادقة القناة (
unauthorized،Forbidden) أن التسليم حُظر بسبب بيانات الاعتماد. - إذا كان التشغيل المعزول يعيد الرمز الصامت فقط (
NO_REPLY/no_reply)، فإن OpenClaw يمنع التسليم الصادر المباشر ويمنع أيضًا مسار ملخص الصف الاحتياطي، لذلك لا يُنشر شيء مرة أخرى في الدردشة. - إذا كان ينبغي للوكيل مراسلة المستخدم بنفسه، فتحقق من أن لدى المهمة مسارًا قابلًا للاستخدام (
channel: "last"مع دردشة سابقة، أو قناة/هدف صريح).
يبدو أن Cron أو Heartbeat يمنع انتقال نمط /new
- لا تعتمد حداثة إعادة الضبط اليومية والخاملة على
updatedAt؛ راجع إدارة الجلسات. - قد تحدّث إيقاظات Cron، وتشغيلات Heartbeat، وإشعارات exec، ومسك دفاتر Gateway صف الجلسة للتوجيه/الحالة، لكنها لا تمدد
sessionStartedAtأوlastInteractionAt. - بالنسبة إلى الصفوف القديمة التي أُنشئت قبل وجود هذه الحقول، يستطيع OpenClaw استعادة
sessionStartedAtمن ترويسة جلسة transcript JSONL عندما يظل الملف متاحًا. تستخدم صفوف الخمول القديمة بلاlastInteractionAtوقت البدء المستعاد هذا كأساس خمول لها.
مزالق المناطق الزمنية
- يستخدم Cron بدون
--tzالمنطقة الزمنية لمضيف Gateway. - تُعامل جداول
atبلا منطقة زمنية على أنها UTC. - يستخدم Heartbeat
activeHoursحل المنطقة الزمنية المضبوط.
ذات صلة
- الأتمتة — جميع آليات الأتمتة في لمحة
- المهام الخلفية — سجل المهام لتنفيذات Cron
- Heartbeat — دورات الجلسة الرئيسية الدورية
- المنطقة الزمنية — إعداد المنطقة الزمنية