المهام المجدولة (Cron)
Cron هو المجدول المدمج في Gateway. فهو يحتفظ بالمهام، ويوقظ الوكيل في الوقت المناسب، ويمكنه إعادة تسليم المخرجات إلى قناة دردشة أو نقطة نهاية webhook.بدء سريع
كيف يعمل cron
- يعمل Cron داخل عملية Gateway (وليس داخل النموذج).
- تُحفَظ المهام في
~/.openclaw/cron/jobs.jsonبحيث لا تؤدي عمليات إعادة التشغيل إلى فقدان الجداول. - تنشئ جميع عمليات تنفيذ cron سجلات المهام الخلفية.
- تُحذف المهام ذات التشغيل الواحد (
--at) تلقائيًا بعد النجاح افتراضيًا. - تحاول عمليات cron المعزولة، بأفضل جهد ممكن، إغلاق علامات تبويب/عمليات المتصفح المتتبعة الخاصة بجلسة
cron:<jobId>عند اكتمال التشغيل، حتى لا تترك أتمتة المتصفح المفصولة عمليات يتيمة وراءها. - تحمي عمليات cron المعزولة أيضًا من ردود الإقرار القديمة. إذا كانت
النتيجة الأولى مجرد تحديث حالة مؤقت (
on itوpulling everything togetherوتلميحات مشابهة) ولم يعد أي تشغيل تابع منحدر لا يزال مسؤولًا عن الإجابة النهائية، فإن OpenClaw يعيد المطالبة مرة واحدة للحصول على النتيجة الفعلية قبل التسليم.
lost على المهمة.
أنواع الجداول
| النوع | علم CLI | الوصف |
|---|---|---|
at | --at | طابع زمني لتشغيل واحد (ISO 8601 أو قيمة نسبية مثل 20m) |
every | --every | فاصل زمني ثابت |
cron | --cron | تعبير cron من 5 أو 6 حقول مع --tz اختياري |
--tz America/New_York للجدولة حسب التوقيت المحلي الفعلي.
تُوزَّع تعبيرات التكرار أعلى كل ساعة تلقائيًا بفارق يصل إلى 5 دقائق لتقليل ارتفاعات الحمل. استخدم --exact لفرض توقيت دقيق أو --stagger 30s لنافذة صريحة.
أنماط التنفيذ
| النمط | قيمة --session | يعمل في | الأنسب لـ |
|---|---|---|---|
| الجلسة الرئيسية | main | دورة heartbeat التالية | التذكيرات، وأحداث النظام |
| معزول | isolated | cron:<jobId> مخصصة | التقارير، والمهام الخلفية |
| الجلسة الحالية | current | يُربط وقت الإنشاء | الأعمال الدورية المعتمدة على السياق |
| جلسة مخصصة | session:custom-id | جلسة مسماة دائمة | سير العمل الذي يعتمد على السجل |
--wake now أو --wake next-heartbeat). تعمل المهام المعزولة بدورة وكيل مخصصة مع جلسة جديدة. تحتفظ الجلسات المخصصة (session:xxx) بالسياق عبر مرات التشغيل، مما يتيح سير عمل مثل الاجتماعات اليومية المختصرة التي تعتمد على الملخصات السابقة.
بالنسبة للمهام المعزولة، يتضمن التفكيك في وقت التشغيل الآن تنظيف المتصفح، بأفضل جهد، لتلك الجلسة الخاصة بـ cron. ويتم تجاهل إخفاقات التنظيف بحيث تبقى نتيجة cron الفعلية هي المعتمدة.
عندما تقوم عمليات cron المعزولة بتنسيق وكلاء فرعيين، يفضّل التسليم أيضًا
المخرجات النهائية التابعة بدلًا من النص المؤقت القديم للأصل. وإذا كانت العمليات التابعة لا تزال
قيد التشغيل، فإن OpenClaw يحجب هذا التحديث الجزئي من الأصل بدلًا من إعلانه.
خيارات الحمولة للمهام المعزولة
--message: نص المطالبة (مطلوب للمهام المعزولة)--model/--thinking: تجاوزات النموذج ومستوى التفكير--light-context: تخطي حقن ملف تهيئة مساحة العمل--tools exec,read: تقييد الأدوات التي يمكن للمهمة استخدامها
--model النموذج المسموح المحدد لتلك المهمة. إذا كان النموذج المطلوب
غير مسموح به، يسجل cron تحذيرًا ويعود إلى اختيار نموذج الوكيل/الافتراضي
لتلك المهمة بدلًا من ذلك. وتظل سلاسل التراجع المهيأة مطبقة، لكن تجاوز
النموذج العادي من دون قائمة تراجع صريحة لكل مهمة لم يعد يضيف النموذج
الأساسي للوكيل كهدف إعادة محاولة إضافي مخفي.
أولوية اختيار النموذج للمهام المعزولة هي:
- تجاوز نموذج hook الخاص بـ Gmail (عندما يكون التشغيل قادمًا من Gmail ويكون هذا التجاوز مسموحًا)
modelفي حمولة كل مهمة- تجاوز النموذج المخزن لجلسة cron
- اختيار نموذج الوكيل/الافتراضي
params.fastMode، فإن cron المعزول يستخدم ذلك افتراضيًا. ويظل تجاوز
fastMode المخزن للجلسة متقدمًا على الإعداد في كلا الاتجاهين.
إذا واجه تشغيل معزول تسليمًا مباشرًا لتبديل النموذج، يعيد cron المحاولة باستخدام
المزوّد/النموذج المُبدَّل ويحفظ هذا الاختيار المباشر قبل إعادة المحاولة. وعندما
يحمل التبديل أيضًا ملف تعريف مصادقة جديدًا، فإن cron يحفظ تجاوز ملف تعريف المصادقة هذا أيضًا.
إعادات المحاولة محدودة: بعد المحاولة الأولية بالإضافة إلى محاولتي تبديل،
يُجهِض cron بدلًا من الدخول في حلقة لا نهائية.
التسليم والمخرجات
| الوضع | ما الذي يحدث |
|---|---|
announce | تسليم الملخص إلى القناة المستهدفة (الافتراضي للمهام المعزولة) |
webhook | إرسال حمولة حدث الاكتمال إلى URL عبر POST |
none | داخلي فقط، بلا تسليم |
--announce --channel telegram --to "-1001234567890" للتسليم إلى قناة. بالنسبة لموضوعات منتدى Telegram، استخدم -1001234567890:topic:123. يجب أن تستخدم أهداف Slack/Discord/Mattermost بادئات صريحة (channel:<id> وuser:<id>).
بالنسبة للمهام المعزولة المملوكة لـ cron، يمتلك المشغّل مسار التسليم النهائي. تتم
مطالبة الوكيل بإرجاع ملخص نصي عادي، ثم يُرسل هذا الملخص عبر
announce أو webhook أو يُحتفظ به داخليًا عند none. لا يعيد --no-deliver
التسليم إلى الوكيل؛ بل يُبقي التشغيل داخليًا.
إذا كانت المهمة الأصلية تنص صراحةً على إرسال رسالة إلى مستلم خارجي ما، فيجب على
الوكيل أن يذكر في مخرجاته إلى من/أين ينبغي أن تذهب تلك الرسالة بدلًا من
محاولة إرسالها مباشرةً.
تتبع إشعارات الفشل مسار وجهة منفصلًا:
- يعيّن
cron.failureDestinationالقيمة الافتراضية العامة لإشعارات الفشل. - يتجاوز
job.delivery.failureDestinationذلك لكل مهمة. - إذا لم يُضبط أي منهما وكانت المهمة تسلّم بالفعل عبر
announce، فإن إشعارات الفشل تعود الآن إلى هدف announce الأساسي هذا. - لا يكون
delivery.failureDestinationمدعومًا إلا في المهام ذاتsessionTarget="isolated"ما لم يكن وضع التسليم الأساسي هوwebhook.
أمثلة CLI
تذكير بتشغيل واحد (الجلسة الرئيسية):Webhooks
يمكن لـ Gateway كشف نقاط نهاية HTTP webhook للمشغلات الخارجية. فعّل ذلك في الإعدادات:المصادقة
يجب أن يتضمن كل طلب رمز hook عبر ترويسة:Authorization: Bearer <token>(موصى به)x-openclaw-token: <token>
POST /hooks/wake
أضف حدث نظام إلى قائمة انتظار الجلسة الرئيسية:text(مطلوب): وصف الحدثmode(اختياري):now(الافتراضي) أوnext-heartbeat
POST /hooks/agent
شغّل دورة وكيل معزولة:message (مطلوب)، name، agentId، wakeMode، deliver، channel، to، model، thinking، timeoutSeconds.
Hooks المعينة (POST /hooks/<name>)
تُحل أسماء hooks المخصصة عبرhooks.mappings في الإعدادات. ويمكن للتعيينات تحويل الحمولات العشوائية إلى إجراءات wake أو agent باستخدام قوالب أو تحويلات برمجية.
الأمان
- أبقِ نقاط نهاية hook خلف local loopback أو tailnet أو reverse proxy موثوق.
- استخدم رمز hook مخصصًا؛ لا تعِد استخدام رموز مصادقة gateway.
- أبقِ
hooks.pathعلى مسار فرعي مخصص؛ يتم رفض/. - اضبط
hooks.allowedAgentIdsلتقييد التوجيه الصريح لـagentId. - أبقِ
hooks.allowRequestSessionKey=falseما لم تكن تحتاج إلى جلسات يحددها المتصل. - إذا فعّلت
hooks.allowRequestSessionKey، فاضبط أيضًاhooks.allowedSessionKeyPrefixesلتقييد أشكال مفاتيح الجلسات المسموح بها. - تُغلَّف حمولات hook بحدود أمان افتراضيًا.
تكامل Gmail PubSub
اربط مشغلات صندوق وارد Gmail بـ OpenClaw عبر Google PubSub. المتطلبات المسبقة: CLIgcloud، وgog (gogcli)، وhooks مفعلة في OpenClaw، وTailscale لنقطة النهاية العامة عبر HTTPS.
إعداد المعالج (موصى به)
hooks.gmail، ويفعّل الإعداد المسبق لـ Gmail، ويستخدم Tailscale Funnel لنقطة نهاية الدفع.
التشغيل التلقائي لـ Gateway
عندما يكونhooks.enabled=true وhooks.gmail.account مضبوطًا، يبدأ Gateway تشغيل gog gmail watch serve عند الإقلاع ويجدد المراقبة تلقائيًا. اضبط OPENCLAW_SKIP_GMAIL_WATCHER=1 لإلغاء الاشتراك.
إعداد يدوي لمرة واحدة
- حدّد مشروع GCP الذي يملك عميل OAuth المستخدم بواسطة
gog:
- أنشئ topic وامنح Gmail صلاحية دفع النشر:
- ابدأ المراقبة:
تجاوز نموذج Gmail
إدارة المهام
- يغيّر
openclaw cron add|edit --model ...النموذج المحدد للمهمة. - إذا كان النموذج مسموحًا، يصل هذا المزوّد/النموذج المحدد نفسه إلى تشغيل الوكيل المعزول.
- إذا لم يكن مسموحًا، يحذّر cron ويعود إلى اختيار نموذج الوكيل/الافتراضي للمهمة.
- تظل سلاسل التراجع المهيأة مطبقة، لكن تجاوز
--modelالعادي من دون قائمة تراجع صريحة لكل مهمة لم يعد ينتقل إلى النموذج الأساسي للوكيل باعتباره هدف إعادة محاولة إضافيًا صامتًا.
الإعدادات
cron.enabled: false أو OPENCLAW_SKIP_CRON=1.
إعادة محاولة التشغيل الواحد: تتم إعادة المحاولة للأخطاء المؤقتة (حد المعدل، والتحميل الزائد، والشبكة، وخطأ الخادم) حتى 3 مرات مع تراجع أُسّي. أما الأخطاء الدائمة فتؤدي إلى التعطيل فورًا.
إعادة محاولة المهام المتكررة: تراجع أُسّي (من 30 ثانية إلى 60 دقيقة) بين المحاولات. ويُعاد ضبط التراجع بعد التشغيل الناجح التالي.
الصيانة: يقوم cron.sessionRetention (الافتراضي 24h) بتقليم إدخالات جلسات التشغيل المعزولة. كما يقوم cron.runLog.maxBytes / cron.runLog.keepLines بتقليم ملفات سجل التشغيل تلقائيًا.
استكشاف الأخطاء وإصلاحها
تسلسل الأوامر
Cron لا يعمل
- تحقّق من
cron.enabledومتغير البيئةOPENCLAW_SKIP_CRON. - أكّد أن Gateway يعمل بشكل مستمر.
- بالنسبة لجداول
cron، تحقّق من المنطقة الزمنية (--tz) مقارنة بالمنطقة الزمنية للمضيف. - تعني
reason: not-dueفي مخرجات التشغيل أنه تم التحقق من التشغيل اليدوي باستخدامopenclaw cron run <jobId> --dueوأن المهمة لم يحن موعدها بعد.
تم تشغيل Cron لكن لم يحدث تسليم
- يعني وضع التسليم
noneأنه لا يُتوقع إرسال أي رسالة خارجية. - يعني غياب/عدم صحة هدف التسليم (
channel/to) أنه تم تخطي الإرسال الخارجي. - تعني أخطاء مصادقة القناة (
unauthorizedوForbidden) أن التسليم تم حجبه بواسطة بيانات الاعتماد. - إذا أعاد التشغيل المعزول فقط الرمز الصامت (
NO_REPLY/no_reply)، فإن OpenClaw يحجب التسليم الخارجي المباشر ويحجب أيضًا مسار الملخص الاحتياطي الموضوع في قائمة الانتظار، لذلك لا يُنشر أي شيء إلى الدردشة. - بالنسبة للمهام المعزولة المملوكة لـ cron، لا تتوقع من الوكيل استخدام أداة الرسائل
كحل احتياطي. فالمشغّل يملك التسليم النهائي؛ ويبقي
--no-deliverالتشغيل داخليًا بدلًا من السماح بإرسال مباشر.
ملاحظات مهمة حول المنطقة الزمنية
- يستخدم Cron بدون
--tzالمنطقة الزمنية لمضيف gateway. - تُعامل جداول
atالتي لا تحتوي على منطقة زمنية على أنها UTC. - يستخدم
activeHoursفي heartbeat تحليل المنطقة الزمنية المهيأ.
ذو صلة
- الأتمتة والمهام — لمحة سريعة عن جميع آليات الأتمتة
- المهام الخلفية — سجل المهام لتنفيذات cron
- Heartbeat — دورات الجلسة الرئيسية الدورية
- المنطقة الزمنية — إعداد المنطقة الزمنية