انتقل إلى المحتوى
use-cases / cron-that-expires-itself / hero
HOODY CRON / SELF-EXPIRING ENTRIES

مهمّة cron تحذف نفسها عند انتهائها

تطارد علّة متقطّعة؟ فرّغ شجرة العمليّات كلّ دقيقة لمدّة 48 ساعة، ثمّ لا شيء بعدها. أرسل POST لإنشاء قيد cron مُدار مع تعيين expires_at، وسيكون للجدول عمر نصف — لا تذكير، لا PR للتنظيف، لا قيد قديم بعد ستّة أشهر.

اقرأ التوثيق
use-cases / cron-that-expires-itself / lifecycle

جدول له عمر نصف

ثلاث لحظات. أنشئ القيد بموعد نهائيّ. يعمل الجدول من تلقاء نفسه. عند expires_at، يحذف القيد نفسه — ويعود crontab كما كان قبل أن تبدأ التصحيح.

دورة حياة قيد ينتهي ذاتيّاًإنشاء ← تشغيل ← انتهاء
01 / إنشاء

POST مع expires_at

أرسل قيد cron مُدار إلى الـ API يحتوي الجدول والأمر وطابع expires_at بعد 48 ساعة. تستلم معرّفاً وتأكيداً بأنّ القيد مُفعَّل.

02 / تشغيل

يعمل وفق الجدول

ينفَّذ القيد عند كلّ نبضة من تعبير cron — كلّ دقيقة، كلّ ساعة، أيّاً كان ما تحدّده. سلوك مطابق للقيد الدائم، مع فرق هادئ واحد.

03 / انتهاء

يحذف نفسه عند الموعد النهائيّ

حين تتجاوز ساعة الحائط expires_at، يُزال القيد. لا تشغيل أخير، لا صفّ زومبي، لا تنظيف يدويّ. GET /entries يعيد القائمة كما لو أنّك لم تكن موجوداً.

لا سكربت تنظيف. لا تذكير في التقويم. لا نقاش جماعيّ بعد ستّة أشهر حول «من يملك هذا؟». عرف القيد متى من المفترض أن يموت، ومات.

use-cases / cron-that-expires-itself / mechanism

أمران بـ curl وساعة

أنشئ القيد بـ POST. تحقّق من اختفائه بـ GET بعد 49 ساعة. الآليّة كلّها مكالمتا HTTP وطابع زمنيّ — لا cron daemon تُسجّل دخوله بـ SSH، لا /etc/crontab تعدّله.

create.sh
POST
# create a self-deleting cron entry
curl -X POST \
  https://cron.containers.hoody.com/api/v1/cron/users/me/entries \
  -H "Content-Type: application/json" \
  -d '["schedule":"* * * * *","command":"pgrep auth | tee -a tree.log","expires_at":"2026-05-06T11:14:00Z"]'

# response
HTTP/1.1 201 Created
{ "id":"e7d3", "expires_at":"2026-05-06T11:14:00Z", "enabled":true }
verify.sh
GET
# 49 hours later — list is back to normal
curl GET https://cron.containers.hoody.com/api/v1/cron/users/me/entries

HTTP/1.1 200 OK
[
  { "id":"a1f2", "expires_at":null, ... },
  { "id":"c4b9", "expires_at":null, ... },
  { "id":"9b21", "expires_at":null, ... }
]
# e7d3 was here. e7d3 deleted itself.

حقل expires_at هو العقد. لست مضطرّاً لتذكّر التنظيف لأنّ التذكّر ليس جزءاً من البروتوكول — الموعد النهائيّ هو الجزء.

use-cases / cron-that-expires-itself / powers

ما يفتحه عمر النصف

حالما يصبح للجدول تاريخ انتهاء، تتوقّف ثلاثة أمور عن كونها مشكلتك: الانحراف، السهو، وإرهاق التدقيق. يبقى crontab نظيفاً افتراضيّاً.

بلا انحراف

لا يستطيع crontab أن يتراكم

كلّ قيد «سأكتفي مؤقّتاً…» يحمل موعداً نهائيّاً مدمجاً. يقلّم crontab نفسه — لا حملة تنظيف فصليّة، لا صفوف قديمة لا أحد يجرؤ على حذفها لأنّ لا أحد يعرف ماذا فعلت.

بلا سهو

النسيان مقبول

لست مضطرّاً لتذكّر إزالة القيد. لست مضطرّاً لضبط تذكير في التقويم. لست مضطرّاً لرفع PR للتنظيف. الموعد النهائيّ هو التذكير — وهو يُطلق دائماً.

قابل للتدقيق

السجلّات تعيش بعد القيد

اختفى القيد لكن لم تختفِ التشغيلات. كلّ تنفيذ ما زال يحمل سطر سجلّه ورمز خروجه وطابعه الزمنيّ — أثر «هذا اشتغل 48 ساعة ثمّ توقّف» قابل لإعادة البناء كاملاً بعد فوات الأوان.

use-cases / cron-that-expires-itself / capacity

رخيص، سريع، بالجملة

القيود ذاتيّة الانتهاء تكلّف مثل الدائمة. كدّس ما تشاء — صُمّم الـ API للحالة التي يكون فيها لكلّ مصحّح في الفريق ثلاث أو أربع مهامّ مؤقّتة قيد التشغيل.

  1. أدنى دقّة1 min

    تعابير cron القياسيّة، حتى دقّة الدقيقة الواحدة. يقبل حقل expires_at أيّ طابع زمنيّ بصيغة RFC 3339.

  2. لكلّ حساب100s

    مساحة وافرة لفريق من المصحّحين، يشغّل كلّ منهم حفنة من التحقيقات المؤقّتة بجانب المهامّ الدائمة.

  3. خطوات يدويّة0 cleanup

    لا أمر DELETE تتذكّره. لا تذكرة «تنظيف cron قديم» في القائمة. القيد يتولّى نهاية حياته بنفسه.

تتسع الحدود وفق فئة خدمة cron في حسابك. تُحفظ السجلّات وفق نافذة الاحتفاظ القياسيّة لـ Hoody Cron بعد انتهاء القيد ذاته.

use-cases / cron-that-expires-itself / punchline

العمل المؤقّت يجب ألّا يترك قيود crontab دائمة.

الطريقة القديمةطريقة عمر النصف
بدون expires_atecho '* * * * * pgrep auth …' >> /etc/crontabوتذكير في التقويم ستتجاهله
مع expires_atPOST /entries [ expires_at: "+48h" ]يحذف الجدول نفسه عند الموعد النهائيّ
اقرأ التوثيق
use-cases / cron-that-expires-itself / replaces

ما يحلّ محلّه

الأنماط التي يلجأ إليها المطوّرون حين يحتاجون سطر cron لمرّة واحدة. كلّ نمط يترك أثراً. expires_at يكنسه.

  • تقليم crontab يدويّاًبحث grep أسبوعيّ عن تعليقات «DELETE_AFTER»
  • ملاحظات «TODO: remove this»ملصقة على الشاشة. تتلاشى بعد سبرنت واحد.
  • دورة حياة cron في TerraformPR-ان لجدولة عمل لمرّة واحدة
  • مهامّ تنظيف مخصّصةcron ثانية وظيفتها الوحيدة قتل الأولى
  • خيوط تذكير في Slackبشريّ في المستقبل بوصفه جامع نفاياتك
  • GitHub issue + تدقيق ذاتيّ لـ cronاجتماع أسبوعيّ للحديث عن سطور cron
use-cases / cron-that-expires-itself / cta

العمل المؤقّت يجب ألّا يترك قيود crontab دائمة.

اقرأ التوثيق
use-cases / cron-that-expires-itself / related

اقرأ الآخرين