إشارة مرور إلى العمليات المدارة باستخدام Supervisord
-
30-09-2019 - |
سؤال
أنا أستخدم Supervisord لتفرخ وإدارة تطبيق FastCgi الذي أكتبه في C لهدف Linux. لديّ معالج إشارة يخرج من طلبي بأمان عند استلام Sigint. لقد تحقق من أن معالج الإشارة يعمل حسب الرغبة في تشغيل التطبيق في نافذة طرفية وإصدار CTRL-C للخروج.
عند إصدار أمر "إيقاف" إلى Supervisord (عبر SupervisorCtl) ، يبدو أن Supervisord غير قادر على إجبار التطبيق على الخروج دون استدعاء Sigkill:
2010-08-20 10:02:49,661 INFO waiting for cse to die
2010-08-20 10:02:52,665 INFO waiting for cse to die
2010-08-20 10:02:55,669 INFO waiting for cse to die
2010-08-20 10:02:58,672 INFO waiting for cse to die
2010-08-20 10:02:59,673 WARN killing 'cse' (2031) with SIGKILL
2010-08-20 10:02:59,674 INFO stopped: cse (terminated by SIGKILL)
لدي ما يلي في ملف supcentisord.conf
stopsignal=INT
من افتراض أن مشكلات Supervisord "STOPSIGNAL" عند استدعاء أمر إيقاف التشغيل ، لذلك أأخذ بيانات المعلومات كدليل على أن تطبيقي لا يستجيب إلى Sigint الصادر عن Supervisord.
كيف يمكنني إجراء تصحيح الإشارة التي تمر بين Supervisord وتطبيقي؟
المحلول 2
بعد بعض الحفر ، يبدو أن المشكلة ليست أن Supervisord فشل في نقل الإشارات إلى عمليات الطفل. يبدو أن هذا يعمل بشكل طبيعي.
بدلاً من ذلك ، يبدو أن Supervisord يتوقف عن تسجيل عمليات STDERR لعملية الطفل بمجرد أن يتلقى طلبًا لاستدعاء StopSignal. ونتيجة لذلك ، لن تتم معالجة أي قطع تسجيل تستند إلى Stderr لإغلاق عملية الطفل بواسطة Supervisord. في حالتي ، جعل هذا يبدو أن عملية الطفل لم تتلقى sigint ، لأنه لم يكن تسجيل أي شيء إلى Stderr بعد التذرع بالإشارة.
نصائح أخرى
يمكنك تشغيل Supervisord على سطر الأوامر في وضع التصحيح والحصول على مزيد من المعلومات.
Supervisord -N -e Debug
كان هذا خطأ تم إصلاحه منذ ذلك الحين في إصدار 3.0A10 (2011-03-30) وفقًا لهذا الالتزام: https://github.com/supervisor/supervisor/commit/e19cbc185dfad045c8775750d36ab8ceed4c4dfb