ظهر الإشعار بعد عشرين دقيقة من الاتصال. وكان العدّاد أسفله يعمل منذ صباح اليوم السابق، أو منذ آخر مصادقة للحساب، ولم يقل شيء في التنبيه أيهما. هذا هو العَرَض: تذكير مربوط بشيء غير الاتصال الذي أمامك.

الحل ليس تنبيهًا أفضل. الحل هو تحديد أي ساعة يقصدها المتطلب، ثم ربط المؤقّت بكائن موجود في تلك الساعة.

ما الذي انطلق، وما الذي كان يعدّه

ثلاثة مصادر محتملة تنتج الرسالة نفسها. قاعدة تقويم تعمل في وقت محلي ثابت ولا تعرف شيئًا عن الأنفاق. وعدّاد في العميل يتراكم ما دام أي اتصال قائمًا ويصمد أمام إعادات الاتصال. وسياسة بوابة تُنهي الجلسة من جهة الخادم وتدفع تحذيرًا قبل ذلك.

المصدران الأخيران فقط يتعلقان بجلسة، وهما أيضًا لا يتفقان. عدّاد العميل يقيس ما لاحظته العملية المحلية؛ والبوابة تقيس ما صادقته وما حسبته. والسبات أو تغيّر الشبكة أو إعادة تشغيل المراقب يمكن أن يفصل بينهما بساعات، ولهذا ينحرف التنبيه عن الانتهاء المفروض.

ثلاث ساعات خلف متطلب واحد

ابدأ بكتابة الجملة التي تريدها فعلًا. التحذير قبل أن تُنهي البوابة هذا الاتصال ليس المتطلب نفسه الذي هو التذكير بعد يوم من وقت الاتصال. ولا هو نفسه الإبلاغ بأن هذه الجلسة قائمة منذ 23 ساعة. كل صيغة تسمّي حدثًا مختلفًا، وعلى مكوّن مختلف أن يجيب عنه.

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

اربط المؤقّت بالجلسة، لا بالحساب

اختر الكائن أولًا. يمكن أن يحمل الحساب عدة أجهزة وعدة جلسات متزامنة، لذا لا يستطيع تذكير مربوط باسم المستخدم أن يحدد أي اتصال بلغ العمر. اربطه بالملف الشخصي مع ذلك التنشيط، وألغِ الإشعار المعلّق عندما ينتهي التنشيط.

Evidence you can readWhat it establishesWhere it misleads
Connection state changes to activeA session started nowDoes not carry the gateway's own session identifier
Duration reported at disconnectTotal service time for that sessionArrives too late for any advance notice
Interim usage updateTime accounted up to that updateStaleness equals the update interval
Local timestamp taken at activationAge of your observationResets whenever the observer restarts

ذلك الجدول عقد لأداة الإشعار الخاصة بك، وليس وصفًا لواجهة رد نداء أي عميل. وأي شيء يوثّقه المنتج المثبّت عن حالة الاتصال هو المصدر الذي تربط به؛ وحيث لا يكشف إلا أحداث المصادقة، فقُل ذلك صراحة واقبل السلوك الأخشن بدلًا من استنتاج جلسة.

اختبره بعتبة قصيرة

لا تصلح أبدًا مؤقّتًا يمتد يومًا بانتظار يمتد يومًا. أضف عتبة قابلة للضبط، واضبطها على ثلاثين ثانية، ونفّذ أربعة انتقالات بالترتيب: اتصل، انتظر، افصل، أعد الاتصال. يجب أن ينتج كل انتقال تغيّر حالة واحدًا بالضبط، ويجب أن تجدول إعادة الاتصال موعدًا جديدًا بدلًا من أن ترث القديم.

# current connection state and profile identity
nmcli -f GENERAL.STATE,GENERAL.CONNECTION connection show work

# the notifier unit you wrote: does it restart the deadline or resume it?
journalctl --user -u vpn-timer.service --since "-5 min" -o cat

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

السبات وإعادة الاتصال والتسليم الفائت

السبات يكسر التصميمين الساذجين. العدّ التنازلي الرتيب يتوقف أثناء سبات الجهاز، والموعد المبني على ساعة الحائط يستمر في التقدم، والمؤقّت الذي ينطلق أثناء السبات يُسلَّم متأخرًا أو لا يُسلَّم أبدًا. قرر أي سلوك يحتاجه متطلبك، ثم أدخل الجهاز في السبات عبر العتبة وتأكد.

التسليم يستحق العناية نفسها. إذا تعذّر عرض الإشعار، فضعْه في قائمة انتظار، وأعد التحقق من أن الجلسة المستهدفة ما زالت موجودة قبل عرضه أخيرًا؛ وإلا حُذّر المستخدم من اتصال انتهى بالفعل. يبقى الفصل القسري وتجديد بيانات الاعتماد خارج هذا المسار، لأن تذكيرًا يغيّر مصير الاتصال بهدوء هو قرار سياسة يلبس ثوب إشعار.

مقالات ذات صلة