
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
تطارد علّة متقطّعة؟ فرّغ شجرة العمليّات كلّ دقيقة لمدّة 48 ساعة، ثمّ لا شيء بعدها. أرسل POST لإنشاء قيد cron مُدار مع تعيين expires_at، وسيكون للجدول عمر نصف — لا تذكير، لا PR للتنظيف، لا قيد قديم بعد ستّة أشهر.
{ "schedule": "* * * * *", "command": "pgrep auth | tee -a tree.log", "expires_at": "2026-05-06T11:14:00Z" }
POST /users/me/entries مع expires_at — يعمل القيد كلّ دقيقة، ثمّ يحذف نفسه عند الموعد النهائيّ
ثلاث لحظات. أنشئ القيد بموعد نهائيّ. يعمل الجدول من تلقاء نفسه. عند expires_at، يحذف القيد نفسه — ويعود crontab كما كان قبل أن تبدأ التصحيح.
أرسل قيد cron مُدار إلى الـ API يحتوي الجدول والأمر وطابع expires_at بعد 48 ساعة. تستلم معرّفاً وتأكيداً بأنّ القيد مُفعَّل.
ينفَّذ القيد عند كلّ نبضة من تعبير cron — كلّ دقيقة، كلّ ساعة، أيّاً كان ما تحدّده. سلوك مطابق للقيد الدائم، مع فرق هادئ واحد.
حين تتجاوز ساعة الحائط expires_at، يُزال القيد. لا تشغيل أخير، لا صفّ زومبي، لا تنظيف يدويّ. GET /entries يعيد القائمة كما لو أنّك لم تكن موجوداً.
لا سكربت تنظيف. لا تذكير في التقويم. لا نقاش جماعيّ بعد ستّة أشهر حول «من يملك هذا؟». عرف القيد متى من المفترض أن يموت، ومات.
أنشئ القيد بـ POST. تحقّق من اختفائه بـ GET بعد 49 ساعة. الآليّة كلّها مكالمتا HTTP وطابع زمنيّ — لا cron daemon تُسجّل دخوله بـ SSH، لا /etc/crontab تعدّله.
# 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 }
# 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 هو العقد. لست مضطرّاً لتذكّر التنظيف لأنّ التذكّر ليس جزءاً من البروتوكول — الموعد النهائيّ هو الجزء.
حالما يصبح للجدول تاريخ انتهاء، تتوقّف ثلاثة أمور عن كونها مشكلتك: الانحراف، السهو، وإرهاق التدقيق. يبقى crontab نظيفاً افتراضيّاً.
كلّ قيد «سأكتفي مؤقّتاً…» يحمل موعداً نهائيّاً مدمجاً. يقلّم crontab نفسه — لا حملة تنظيف فصليّة، لا صفوف قديمة لا أحد يجرؤ على حذفها لأنّ لا أحد يعرف ماذا فعلت.
لست مضطرّاً لتذكّر إزالة القيد. لست مضطرّاً لضبط تذكير في التقويم. لست مضطرّاً لرفع PR للتنظيف. الموعد النهائيّ هو التذكير — وهو يُطلق دائماً.
اختفى القيد لكن لم تختفِ التشغيلات. كلّ تنفيذ ما زال يحمل سطر سجلّه ورمز خروجه وطابعه الزمنيّ — أثر «هذا اشتغل 48 ساعة ثمّ توقّف» قابل لإعادة البناء كاملاً بعد فوات الأوان.
القيود ذاتيّة الانتهاء تكلّف مثل الدائمة. كدّس ما تشاء — صُمّم الـ API للحالة التي يكون فيها لكلّ مصحّح في الفريق ثلاث أو أربع مهامّ مؤقّتة قيد التشغيل.
تعابير cron القياسيّة، حتى دقّة الدقيقة الواحدة. يقبل حقل expires_at أيّ طابع زمنيّ بصيغة RFC 3339.
مساحة وافرة لفريق من المصحّحين، يشغّل كلّ منهم حفنة من التحقيقات المؤقّتة بجانب المهامّ الدائمة.
لا أمر DELETE تتذكّره. لا تذكرة «تنظيف cron قديم» في القائمة. القيد يتولّى نهاية حياته بنفسه.
تتسع الحدود وفق فئة خدمة cron في حسابك. تُحفظ السجلّات وفق نافذة الاحتفاظ القياسيّة لـ Hoody Cron بعد انتهاء القيد ذاته.
العمل المؤقّت يجب ألّا يترك قيود crontab دائمة.
الأنماط التي يلجأ إليها المطوّرون حين يحتاجون سطر cron لمرّة واحدة. كلّ نمط يترك أثراً. expires_at يكنسه.
العمل المؤقّت يجب ألّا يترك قيود crontab دائمة.