المهام المجدولة (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 لنافذة صريحة.
يستخدم يوم الشهر ويوم الأسبوع منطق OR
تُحلَّل تعبيرات cron بواسطة croner. عندما يكون حقلا يوم الشهر ويوم الأسبوع كلاهما غير wildcard، يطابق croner عندما يطابق أحد الحقلين — وليس كلاهما. وهذا هو سلوك Vixie cron القياسي.+ الخاص بـ Croner (0 9 15 * +1) أو قم بالجدولة على أحد الحقلين وطبّق الحراسة على الآخر داخل prompt أو command الخاص بالمهمة.
أنماط التنفيذ
| النمط | قيمة --session | يعمل في | الأنسب لـ |
|---|---|---|---|
| الجلسة الرئيسية | main | دورة heartbeat التالية | التذكيرات، وأحداث النظام |
| معزول | isolated | cron:<jobId> مخصص | التقارير، والمهام الخلفية |
| الجلسة الحالية | current | مرتبط عند وقت الإنشاء | الأعمال المتكررة المرتبطة بالسياق |
| جلسة مخصصة | session:custom-id | جلسة مسماة دائمة | سير العمل الذي يعتمد على السجل |
--wake now أو --wake next-heartbeat). وتُشغِّل المهام المعزولة دورة وكيل مخصصة بجلسة جديدة. وتحافظ الجلسات المخصصة (session:xxx) على السياق عبر مرات التشغيل، مما يتيح سير عمل مثل الاجتماعات اليومية التي تعتمد على الملخصات السابقة.
بالنسبة إلى المهام المعزولة، يتضمن تفكيك وقت التشغيل الآن تنظيفًا بأفضل جهد ممكن للمتصفح لجلسة cron تلك. يتم تجاهل إخفاقات التنظيف حتى تبقى نتيجة cron الفعلية هي المعتمدة.
عندما تنسق عمليات cron المعزولة وكلاء فرعيين، يفضّل التسليم أيضًا
مخرجات التابع النهائية على النص المؤقت القديم من الأصل.
وإذا كانت الوكلاء الفرعيون لا يزالون قيد التشغيل، فإن OpenClaw يمنع هذا
التحديث الجزئي من الأصل بدلًا من الإعلان عنه.
خيارات الحمولة للمهام المعزولة
--message: نص prompt (مطلوب للمهام المعزولة)--model/--thinking: تجاوزات النموذج ومستوى التفكير--light-context: تخطي حقن ملف bootstrap الخاص بمساحة العمل--tools exec,read: تقييد الأدوات التي يمكن للمهمة استخدامها
--model النموذج المسموح المحدد لتلك المهمة. إذا كان النموذج المطلوب
غير مسموح، يسجل cron تحذيرًا ويعود إلى اختيار النموذج الافتراضي/نموذج الوكيل
لتلك المهمة بدلًا من ذلك. ولا تزال سلاسل fallback المُعدّة مسبقًا سارية، لكن
تجاوز النموذج العادي من دون قائمة fallback صريحة لكل مهمة لم يعد يضيف
النموذج الأساسي للوكيل كهدف إعادة محاولة إضافي مخفي.
ترتيب أولوية اختيار النموذج للمهام المعزولة هو:
- تجاوز نموذج خطاف Gmail (عندما يأتي التشغيل من Gmail ويكون هذا التجاوز مسموحًا)
modelالموجود في حمولة كل مهمة- تجاوز نموذج جلسة cron المخزّن
- اختيار النموذج الافتراضي/نموذج الوكيل
params.fastMode، فإن cron المعزول يستخدم ذلك افتراضيًا. ويظل تجاوز
fastMode المخزن في الجلسة متقدمًا على الإعداد في كلا الاتجاهين.
إذا واجه تشغيل معزول عملية تسليم إلى تبديل نموذج مباشر، يعيد cron المحاولة مع
المزوّد/النموذج المُبدّل ويحتفظ بذلك الاختيار المباشر قبل إعادة المحاولة. وعندما
يحمل التبديل أيضًا ملف auth شخصيًا جديدًا، يحتفظ cron بهذا التجاوز لملف auth أيضًا.
وتكون عمليات إعادة المحاولة محدودة: بعد المحاولة الأولية بالإضافة إلى محاولتَي
تبديل، يُجهِض 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 للمشغّلات الخارجية. فعّل ذلك في الإعدادات:المصادقة
يجب أن يتضمن كل طلب رمز الخطاف عبر ترويسة: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.
الخطافات المعيّنة (POST /hooks/<name>)
تُحل أسماء الخطافات المخصصة عبرhooks.mappings في الإعدادات. ويمكن لعمليات التعيين تحويل أي حمولة إلى إجراءات wake أو agent باستخدام قوالب أو تحويلات برمجية.
الأمان
- أبقِ نقاط نهاية الخطافات خلف loopback أو tailnet أو reverse proxy موثوق.
- استخدم رمز خطاف مخصصًا؛ ولا تعِد استخدام رموز auth الخاصة بـ gateway.
- أبقِ
hooks.pathعلى مسار فرعي مخصص؛ فالقيمة/مرفوضة. - اضبط
hooks.allowedAgentIdsلتقييد التوجيه الصريح لـagentId. - أبقِ
hooks.allowRequestSessionKey=falseما لم تكن بحاجة إلى جلسات يختارها المستدعي. - إذا فعّلت
hooks.allowRequestSessionKey، فاضبط أيضًاhooks.allowedSessionKeyPrefixesلتقييد أشكال مفاتيح الجلسة المسموح بها. - تُغلَّف حمولات الخطافات بحدود أمان افتراضيًا.
تكامل Gmail PubSub
اربط مشغّلات صندوق بريد Gmail الوارد بـ OpenClaw عبر Google PubSub. المتطلبات المسبقة: CLIgcloud، وgog (gogcli)، وتمكين خطافات OpenClaw، وTailscale لنقطة نهاية HTTPS العامة.
الإعداد عبر المعالج (موصى به)
hooks.gmail، ويفعّل إعداد Gmail المسبق، ويستخدم Tailscale Funnel لنقطة نهاية الدفع.
التشغيل التلقائي لـ Gateway
عندما يكونhooks.enabled=true وhooks.gmail.account مضبوطًا، يبدأ Gateway تشغيل gog gmail watch serve عند الإقلاع ويجدّد watch تلقائيًا. اضبط OPENCLAW_SKIP_GMAIL_WATCHER=1 لإلغاء الاشتراك.
إعداد يدوي لمرة واحدة
- اختر مشروع GCP الذي يملك عميل OAuth المستخدم بواسطة
gog:
- أنشئ topic وامنح Gmail إذن push:
- ابدأ watch:
تجاوز نموذج Gmail
إدارة المهام
- يغيّر
openclaw cron add|edit --model ...النموذج المحدد للمهمة. - إذا كان النموذج مسموحًا، فإن هذا المزوّد/النموذج المحدد نفسه يصل إلى تشغيل الوكيل المعزول.
- إذا لم يكن مسموحًا، يصدر cron تحذيرًا ويعود إلى اختيار النموذج الافتراضي/نموذج الوكيل الخاص بالمهمة.
- تظل سلاسل fallback المُعدّة مسبقًا سارية، لكن تجاوز
--modelالعادي من دون قائمة fallback صريحة لكل مهمة لم يعد ينتقل إلى النموذج الأساسي للوكيل كهدف إعادة محاولة إضافي صامت.
الإعدادات
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) فهذا يعني أنه تم تخطي الإرسال الخارجي. - أخطاء auth الخاصة بالقناة (
unauthorizedوForbidden) تعني أن التسليم تم منعه بسبب بيانات الاعتماد. - إذا أعاد التشغيل المعزول الرمز الصامت فقط (
NO_REPLY/no_reply)، فإن OpenClaw يمنع التسليم الخارجي المباشر ويمنع أيضًا مسار الملخص الاحتياطي الموضوع في قائمة الانتظار، لذلك لا يتم نشر أي شيء مرة أخرى إلى الدردشة. - بالنسبة إلى المهام المعزولة المملوكة لـ cron، لا تتوقع من الوكيل استخدام أداة message
كخيار احتياطي. فالمشغّل يملك التسليم النهائي؛ ويحافظ
--no-deliverعلى التشغيل داخليًا بدلًا من السماح بإرسال مباشر.
تنبيهات المنطقة الزمنية
- يستخدم cron من دون
--tzالمنطقة الزمنية لمضيف gateway. - تُعامل جداول
atمن دون منطقة زمنية على أنها UTC. - يستخدم
activeHoursفي heartbeat دقة المنطقة الزمنية المُعدّة.
ذو صلة
- الأتمتة والمهام — جميع آليات الأتمتة في لمحة
- المهام في الخلفية — سجل المهام لعمليات cron
- Heartbeat — دورات الجلسة الرئيسية الدورية
- المنطقة الزمنية — إعداد المنطقة الزمنية