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

قائمة خصائص صالحة ليست خدمة عاملة

plutil -lint يفحص البنية. لا يستطيع أن يخبرك ما إذا كان الملف التنفيذي موجودًا، أو أن الوسائط مدعومة في إصدار العميل هذا، أو أن المهمة تبدأ في سياق تتوفر فيه بيانات الاعتماد. تلك أسئلة دلالية، وهي تفسّر معظم الأعطال التي تبدو مشاكل launchd.

plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn

اقرأ مخرجات الأمر الثاني بدلًا من افتراض أن المهمة حُمّلت. فهو يبلّغ عن آخر حالة خروج وما إذا كانت الخدمة تعمل، وهذا يميّز بين “لم تبدأ أبدًا” و“بدأت ثم ماتت” قبل أن تلمس الملف التعريفي.

الوكلاء يرثون جلسة مستخدم، والخلفيات لا

توثيق launchd من Apple يفصل وكلاء كل مستخدم عن خلفيات النظام. يعمل الوكيل في سياق المستخدم المسجّل دخوله، بمفتاحاته وبيئته. تعمل الخلفية بدون تلك الجلسة، ونقل مهمة إلى دليل نظام لا يعيد إنشاء بيانات الاعتماد التفاعلية للمستخدم.

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

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

الإشراف لا يعمل إلا إذا بقيت العملية في المقدمة

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

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

امنح المهمة تسمية فريدة، والملف التنفيذي المقصود، ومصفوفة وسائط مدروسة. المصفوفة ليست سطر أوامر shell، لذا لا تعمل الأنابيب وإعادة التوجيه هناك، وتتصرف علامات الاقتباس بشكل مختلف. الأمر الذي ينجح في طرفية مسؤول هو فحص أولي في أفضل الأحوال.

بيانات الاعتماد يجب أن تعمل دون مطالبة

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

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

حدّد معنى الجاهزية، ثم اختبرها هناك

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

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

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

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