انتقل إلى المحتوى
use-cases / on-call-shift-cron / hero
CRON · EXPIRES_AT · إشعارات

تصعيد مناوبة ينتهي بانتهاء ورديتك

أرسل POST لإدخال cron يوم الإثنين مع expires_at مُعيَّن على الجمعة 09:00. المهمة تُنبّه هاتفك كل 30 دقيقة لأربعة أيام، ثم تحذف نفسها لحظة انتهاء الوردية. المناوب التالي يرسل إدخاله. لا جدول PagerDuty، ولا إعدادات مجدوِل مشتركة، ولا تذكير في التقويم لتعطيله.

اقرأ مستندات cron
use-cases / on-call-shift-cron / handoff

كيف تُسلَّم الوردية دون اجتماع

ثلاث نقاط في الأسبوع. وجود إدخال cron يتتبّع الوردية بدقة — لا تداخل، ولا فجوة، ولا سطر crontab متبقٍّ.

الإثنين 09:00 → الجمعة 09:01expires_at يحمل الوردية
الإثنين 09:00

أرسل الإدخال

curl واحد بجدول */30، الأمر يشير إلى hoody-notifications/push/me، و expires_at = الجمعة 09:00:00Z. الخادم يُرجع id e7d3.

الإثنين–الجمعة

التنبيهات تركب على هاتفك

كل 30 دقيقة لأربعة أيام يعمل الإدخال ويُنبّه hoody-notifications. جهازك فقط. قناة الفريق تبقى هادئة.

الجمعة 09:01

الإدخال يحذف نفسه

في 09:00:00Z تحذف خدمة cron الإدخال e7d3. تكّة 09:30 لن تجد ما تُشغّله. المناوب التالي قد أرسل إدخاله بالفعل.

كل مناوب يكتب POST واحداً عند بدء ورديته. حقل expires_at هو بروتوكول التسليم بأكمله — خدمة cron تقوم بالتنظيف، في الثانية المضبوطة.

use-cases / on-call-shift-cron / mechanism

اثنان من curl — واحد لكل وردية

بروتوكول التناوب بأكمله هو طلبا HTTP في الأسبوع. المناوب يرسل POST يوم الإثنين، يطلب القائمة يوم الجمعة، يرى أن الإدخال قد ذهب بالفعل. لا ملف جدولة مشترك للدمج فيه.

monday.sh · m.dossantos
POST · entry
# monday 09:00 — i'm on call until friday 09:00
curl -X POST \
  https://oncall.containers.hoody.com/users/me/entries \
  -H "Content-Type: application/json" \
  -d '["schedule":"*/30 * * * *","command":"curl -fsS hoody-notifications/push/m.dossantos","comment":"على الاتصال المباشر wk19","expires_at":"2026-05-08T09:00:00Z"]'

# response
HTTP/1.1 201 Created
{ "id":"e7d3", "expires_at":"2026-05-08T09:00:00Z", "enabled":true }
friday.sh · m.dossantos
GET · audit
# friday 09:01 — the next on-call took over
curl GET https://oncall.containers.hoody.com/users/me/entries

HTTP/1.1 200 OK
[
  // my entry e7d3 is gone — it expired
  // at 09:00 sharp. j.okafor's new
  // entry took over at 09:00:30.
]
# no slack thread, no calendar reminder

لا تتدخل خدمة جدولة مشتركة. إدخال cron يملكه المهندس؛ لا شيء في إعداد المناوب التالي يعتمد على تنظيف السابق.

use-cases / on-call-shift-cron / powers

ثلاثة أشياء يُزيلها هذا الشكل من أسبوعك

إدخال مناوبة يملك دورة حياته الخاصة يوقف ثلاث فئات من الأخطاء التي لا تستطيع إعدادات PagerDuty وتذكيرات التقويم إيقافها.

توجيه

التنبيهات تركب على جهاز واحد — جهازك

لأن أمر الإدخال يشير إلى نقطة الإشعار الشخصية الخاصة بك، فإن التصعيدات تُوجَّه إلى هاتفك طوال مدة ورديتك، وهذا فقط. لا إزعاج عرضي لقناة الفريق في الـ 3 صباحاً.

ملكية

لا إعدادات مشتركة لتحريرها، ولا PR للدمج

لا يوجد escalation_policy.yaml يلمسه الجميع. كل مهندس يملك إدخاله. مناوبَان في منطقتي زمن مختلفتين لا يمكن أن يتعارضا بتحرير الملف نفسه.

تنظيف

التسليم في البيانات، لا في الدردشة

عندما تحلّ الجمعة 09:00 لا تسأل "لحظة، هل ما زلت أتلقى هذه؟" الإدخال قد ذهب بالفعل. التحقق من التسليم هو GET واحد يُرجع صفّاً واحداً أقلّ.

use-cases / on-call-shift-cron / capacity

ما تضمنه خدمة cron

الأرقام تأتي من Hoody Cron API. حدود حقيقية، لا مُختلَقة.

  1. دقّة الانتهاء1 sec

    الانتهاء التلقائي يعمل وفقاً لساعة النظام. expires_at بقيمة 09:00:00Z يحذف خلال نفس الدقيقة التي تنطلق فيها تكّة cron — لا تأخير حارس بـ 5 دقائق.

  2. حقول لكل جدول5

    تعابير cron القياسية ذات الخمسة حقول إضافة إلى الماكروهات @hourly / @daily / @weekly. */30 * * * * هو ما يطلق كل 30 دقيقة خلال ورديتك.

  3. عزل1 / user

    كل مستخدم نظام له ملف crontab خاص. إدخال المناوب التالي يعيش تحت /users/[name]/entries الخاص به — لا يلمس إدخالك أبداً.

الحدود وفقاً لـ Hoody Cron API: الإدخالات المُدارة هي JSON CRUD مع UUIDs و expires_at؛ الوصول إلى crontab الخام متاح لكل مستخدم؛ عزل crontab لكل مستخدم مدمج.

use-cases / on-call-shift-cron / punchline

عندما تنتهي الوردية، ينتهي إدخال cron — تلقائياً.

قبل · ملف التناوببعد · curlان في الأسبوع
كيف بدا التسليم القديمحرّر oncall.yaml → PR → دمج → نبّه شخصاً ليُعطّلأربعة بشر · ملف مشترك واحد · ومع ذلك تلقى تنبيهاً في الـ 11 صباح الجمعة
كيف يبدو الأمر الآنPOST /entries [ expires_at: '2026-05-08T09:00:00Z' ]مهندس واحد · curl واحد · خدمة cron تقوم بالتنظيف
اقرأ مستندات cron
use-cases / on-call-shift-cron / replaces

ما يستبدله هذا

الأدوات القياسية التي تلجأ إليها لتناوب المناوبات. كل واحدة منها تكلفك خدمة، ومستودع إعدادات، وطقس تسليم. إدخال cron مع expires_at يكلفك POST واحداً.

  • سياسات تصعيد PagerDutyتسعير لكل مقعد لما هو في النهاية curl إلى هاتفك
  • تناوبات Opsgenieمنتج كامل لمعرفة من سيُنبَّه هذا الأسبوع
  • مستودعات إعدادات مناوبة مخصصةYAML مشترك يُرسل الجميع PR له ولا يملكه أحد
  • تذكّر تعطيل cron عند التسليمتذكير تقويم تضبطه، وتتجاهله، وتستاء منه يوم الجمعة
  • تنظيف تصعيد يدويخيط Slack في الـ 11 صباح الجمعة — "هل يستطيع أحد إلغاء اشتراكي"
  • تناوبات VictorOpsخدمة جدولة أخرى لما يقوم به حقل expires_at واحد
use-cases / on-call-shift-cron / cta

توقّف عن تعطيل أسطر crontab صباح الجمعة. اضبط expires_at يوم الإثنين وانساه.

اقرأ مستندات cron
use-cases / on-call-shift-cron / related

اقرأ الآخرين