سؤال ما الفرق بين "عامل التوقف" و "قتل عامل ميناء"؟


ما الفرق بين docker stop و docker kill؟

سوف يقوم كل من Afaik بإيقاف حاوية قيد التشغيل. هل هذا docker stop محاولات لإيقاف تشغيل العملية داخل الحاوية بالطريقة الصحيحة ، بينما docker kill سوف ترسل إشارة قتل؟ إذا كان الأمر كذلك كيف docker stop معرفة كيفية إيقاف عملية التشغيل بشكل صحيح. (لأن هذا يختلف من عملية إلى عملية)


89
2018-05-21 12:54


الأصل




الأجوبة:


هل توقف هذا الرسّام عن محاولات وقف العملية داخل الحاوية بالطريقة الصحيحة ، في حين أن مرسِّل رصيف الميناء سيرسل إشارة قتل؟

أساسا نعم ، الفرق خفية ، ولكن الخطوط العريضة في سطر الأوامر مرجع:

  • توقف عامل الميناء: إيقاف حاوية قيد التشغيل (أرسل SIGTERM ، ثم SIGKILL بعد فترة السماح) [...] ستحصل العملية الرئيسية داخل الحاوية على SIGTERM ، وبعد فترة سماح ، SIGKILL. [التركيز الألغام]
  • عامل ميناء يقتل: قتل حاوية قيد التشغيل (إرسال SIGKILL ، أو إشارة محددة) [...] سيتم إرسال العملية الرئيسية داخل الحاوية SIGKILL ، أو أي إشارة محددة مع خيار - signal. [التركيز الألغام]

وبالتالي stop يحاول إطلاق إيقاف تشغيل رشيقًا عن طريق إرسال المعيار إشارة POSIX  SIGTERM، بينما killيقتل العملية بشكل افتراضي (ولكنه يسمح أيضًا بإرسال أي إشارة أخرى):

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

على الرغم من عدم فرضها في أي حال ، فإنه من المتوقع عمومًا أن تتم معالجة العمليات SIGTERM برشاقة وتفعل الشيء الصحيح اعتمادًا على مسؤولياتهم - يمكن أن يفشل ذلك بسهولة بسبب محاولة إيقاف التشغيل الرشيقة التي تستغرق وقتًا أطول من فترة السماح ، على الرغم من أنه شيء يجب مراعاته إذا كانت سلامة البيانات ذات أهمية قصوى (على سبيل المثال لقواعد البيانات) ؛ انظر على سبيل المثال الرائد هايدن SIGTERM مقابل SIGKILL للحصول على شرح أكثر تفصيلاً:

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


85
2018-05-22 14:12



إذن إذا أردت إجراء إيقاف تشغيل عام للحاويات ، فسيتعين عليّ التقاط SIGTERM في عملية المشرف / runit؟ - CMCDragonkai
ما هي أفضل الممارسات هنا؟ أنا أفهم لماذا نستخدمها docker kill عن طريق اليد لتوفير بعض الوقت أثناء الاغلاق ، ولكن في السيناريو ، أليس من الأفضل دائما محاولة اغلاق عن طريق رشيقة docker stop؟ ما زلت أرى الكثير من docker killق في الكتابات رغم ذلك. - Dennis


docker kill سيوقف عملية / برنامج نقطة الدخول الرئيسية فجأة

docker stop سيحاول إيقافه بأمان (سيسأل بأدب: P)

في كلتا الحالتين سوف تستمر تغييرات نظام الملفات (في وقت التوقف أو القتل) حتى إذا كنت docker start <container> ثم سيستمر من هناك.


6
2018-04-29 14:24



... لكن في حالة docker kill أي تغييرات في نظام الملفات المعلقة والتي ستظل العملية الرئيسية في الذاكرة ستفقد ، لذا قد ينتهي الأمر بنظام الملفات بالتلف؟ - Arjan
من الواضح ، بما أن التوقف مفاجئ ، فستستمر التغييرات في وقت القتل فقط. سيتم فقدان أي شيء معلقة. كانت وجهة نظري أن قتل عامل ميناء ليس حقا ... قتل الحاوية ، ووقف هذه العملية. مثل عند إيقاف تشغيل الكمبيوتر بدلاً من إيقاف التشغيل - awkwardarts


بالإضافة إلى الإجابات المضافة في وقت سابق

جري docker events بعد docker stop يظهر الأحداث

  • تقتل (إشارة 15): حيث إشارة 15 = SIGTERM
  • موت
  • توقف

جري docker events بعد docker kill يظهر الأحداث

  • تقتل (إشارة 9): حيث إشارة 9 = SIGKILL
  • يموت (رمز الخروج 137)

docker stop لديه مهلة قبل قتل العملية. الافتراضي هو 10 ثانية.

هذه الطاولة لديه المزيد من التفاصيل.


0
2017-11-03 07:51