تكنولوجيا

SIGINT و SIGTERM و SIGKILL – CloudSavvy IT

شترستوك / ترقية المهارة

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

ما هو إشارة لينكس؟

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

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

إشارات Linux الأساسية لها رقم (1-30 +). قبل مضي وقت طويل ، سيعرف مستخدمو Linux المتمرسون عادةً واحدًا أو أكثر منهم. على سبيل المثال ، SIGTERM تطابق الإشارة الرقم 15 وتتطابق الإشارة مع الرقم 9 (SIGKILL) ربما يكون الأكثر شهرة ، لأنه يسمح للأشخاص بإنهاء العملية بالقوة ، وهو ليس SIGTERM مثال على الضوء الأحمر.

يعرض htop إشارات البرنامج الممكنة

هنا نرى الشاشة الرئيسية htop (يمكنك تثبيت هذه الأداة بإدخال ما يلي: sudo apt put in htop على Ubuntu / Mint أو sudo yum install htop هناك عدة إشارات إنهاء وإشارات أخرى على RedHat / Centos / Fedora (أسفل القائمة ؛ هناك 37 في المجموع) ، والتي يمكن إرسالها إلى العملية المحددة مسبقًا على اليمين. يمكنك تحديد عملية بالضغط على المؤشر لأعلى / لأسفل ، ثم استخدام F9 لإرسال الإشارة.

SIGKILL & SIGTERM

على الرغم من أن الاسم يبدو مشؤومًا ، إلا أن مصطلح Linux العام لإنهاء العملية هو “قتل” العملية.بشكل عام ، نريد فقط إنهاء مع -9 (SIGKILL) يشير إلى ما إذا كان قد تم تعليق العملية / البرنامج. يرجى ملاحظة أنه كلما تحدثنا عن العمليات أو الإجراءات ، يمكن تبادل هذه الكلمات حسب الرغبة. في الأساس ، تشير العملية إلى أي برنامج (أو خدمة) قيد التشغيل تم منحها الأذونات التالية PID (معرف العملية).

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

أرسل SIGKILL إلى عملية السكون التي تعمل في الخلفية

هنا بدأنا snooze 1800 في الخلفية (باستخدام & في نهاية الأمر) ، يبدأ من الأول ([1])ضد PID 574660.بعد ذلك ، نستخدم الأمر التالي لقتل عملية الخلفية kill -9 574660،فيما بينها -9 وكيل SIGKILL.

على الرغم من أن العملية تنتهي على الفور ، إلا أننا لا نرى رسالة الإنهاء (عملية الخلفية 1 أن يُقتل ، أي [1]+ Killed) ، لأن موجه الأوامر يعود قبل عرض الرسالة ، أي أن العودة إلى سطر الأوامر هي عملية أسرع من إنهاء العملية ، أو عملية مماثلة.

نحن نستخدم grepping PID للتحقق من قائمة العمليات ps -ef | grep 574660.على الرغم من وجود بعض المخرجات ، إلا أن الإخراج المعروض هو فقط لتشغيلنا grep أمر ؛ هذا sleep تم إنهاء العملية.

لنستخدم SIGTERM، بمعنى آخر eliminate -15 $PID أين هي $PID إنها العملية التي نريد إنهاؤها.

أرسل SIGTERM إلى عملية سكون تعمل في الخلفية

يتعين علينا الضغط على Enter لتشغيل / عرض رسالة الإنهاء (كما هو موضح أعلاه). يمكننا أن نرى أن البرنامج ينتهي بشكل صحيح مرة أخرى.ومع ذلك ، هذه المرة ، على الرغم من عدم رؤيتها لهذا المثال بالذات (تابع القراءة!) ، الداخلية rest كود البرنامج الوضع مختلف.

في هذه الحالة (باستخدام -15 بمعنى آخر SIGTERM عملية الإنهاء) ، snooze تم إخطار العملية ولديها الفرصة لمعالجة الإشارة داخليًا. يمكنه بعد ذلك الاستجابة عن طريق الإنهاء الذاتي أو تجاهل الإشارة أو أي إجراء آخر تم تطويره ككود. يمكننا أيضًا إثبات صحة ذلك عن طريق التحقق من إشارة الخروج و / أو الإخراج:

يعتمد الاختلاف في كود الخرج والخروج على الإشارة المرسلة

هنا بدأنا العملية snooze 2000 مرتين ، ثم استخدم جلسة Shell / Terminal أخرى لإنهاء البرنامج.لأول مرة ، استخدمنا destroy -9 نستخدمها للمرة الثانية get rid of -15 قف rest عملية.

نلاحظ على الفور كيف يتم إرجاع الإخراج Killed في الاول (destroy -9 الإجراء) المثيل.للمحاولة الثانية (باستخدام eliminate -15) ، نرى الإخراج Terminated بدلاً من ذلك ؛ ينهي البرنامج نفسه. بعد كل إنهاء ، تحققنا أيضًا من إشارة الخروج ووجدنا أن رمز الخروج مختلف.

لماذا هذا مهم؟ضع في اعتبارك برنامجًا أكبر ؛ في هذه الحالة ، قمنا بإنهاء ملف بسيط sleep أمر. لا توجد بيانات قيد المعالجة ، ولا توجد حركة مرور ذهابًا وإيابًا ، إلخ.ولكن إذا أرسلنا ملف destroy -9 أمر إلى خادم قاعدة البيانات الخاص بنا (بشكل عام ، يتطلب هذا أذونات sudo / مستوى الجذر)؟

سيؤدي ذلك إلى تشغيل قاعدة البيانات للدخول في وضع استرداد الأعطال في المرة التالية التي تبدأ فيها ، لأنه بقدر ما يعرف برنامج قاعدة البيانات ، فإن كل ما يحدث “هناك” ثم “لا شيء”. بعبارة أخرى ، انهار.إذا كنا بدلا من ذلك eliminate -15 الأمر ، قد يكون برنامج قاعدة البيانات قد أكمل إيقاف تشغيل متحكم فيه ، على سبيل المثال ، أولاً منع المستخدمين الجدد من الاتصال ، ثم فصل / إنهاء المستخدمين الحاليين ، ثم إكمال كتابة البيانات ، وما إلى ذلك ، ثم إنهاء نفسه.

استخدم تسلسل لوحة المفاتيح لإرسال إشارات Linux

هل تعلم أنه كلما أرسلت CTRL+c تسلسل المفاتيح للبرنامج قيد التشغيل (على سبيل المثال في الجهاز) بدلاً من SIGINT تم ارساله؟دعنا نعود إلى حيث نحن جديرون بالثقة rest أمر واختبر هذا:

تتم مقاطعة عملية السكون بواسطة إشارة SIGINT المرسلة بواسطة تسلسل المفاتيح CTRL + C.

نبدأ من هنا slumber مرة أخرى ، ثم اضغط على تركيبة لوحة المفاتيح CTRL+c.إنهاء البرنامج ، أو أفضل انقطع بواسطة SIGINT تم إرسال الإشارة. نطلب رمز خروج ونعيد التأكيد على أن كود الخروج مختلف عن الإشارة السابقة.

لاحظ أن رمز الخروج هذا (للنوم) سيتطابق دائمًا مع الإشارة المرسلة ، على الرغم من أنه قد لا يغطي جميع الإشارات.بمعنى آخر ، عند استخدام CTRL+c في سطر الأوامر ، سيكون رمز الخروج دائمًا 130و 137 عندما قتل eliminate -9، مع 143 متي kill -15 كان مستعملا.

يمكنك اختبار كود الخروج للأمر من خلال الاستعلام عن الأمر التالي $? متغير يحمل كود الخروج للأمر السابق (طالما أنك لم تبدأ أمرًا جديدًا بعد). إن معرفة كود الخروج لأمر معين في موقف معين ، و / أو كنتيجة لإشارة معينة مرسلة إلى هذا الأمر ، تكون مفيدة عند كتابة نص يتعامل مع عمليات أخرى ، وما إلى ذلك (هذا هو الحال بالنسبة للعديد من برامج شل النصية ، خاصة في هذه الحالة) عند إدارة الخوادم أو بيئات التشغيل الآلي).

تسلسل لوحة مفاتيح شائع الاستخدام هو CTRL+z.هذا سيرسل ملف SIGTSTP إشارة واحدة suspend إشارة توقف العملية على الفور مؤقتًا حتى (على سبيل المثال) 'fg' قم بإصدار أمر لنفس العملية وسيقوم الأمر بإعادته إلى المقدمة.

لمعرفة المزيد حول إدارة العمليات ، راجع تلميحات إنهاء عملية Bash.

يتم إحتوائه

في هذه المقالة ، درسنا أهم إشارات Linux وكيفية استخدامها فعليًا في بيئة Linux أو Unix.تساعد معرفة إشارات Linux الأساسية في استخدام Linux وإدارته يوميًا ، على سبيل المثال ، عندما تتوقف العملية وتحتاج إلى إنهاء get rid of -9.في المقالات المستقبلية ، قد نفكر في استخدام lure تسمح الأوامر في نصوص Bash النصية للمستخدمين بتحديد إجراءات مخصصة ليتم تنفيذها عند إصدار مثل هذه الإشارات.

إذا كنت تحب قراءة هذا المقال ، فيرجى الاطلاع على سلسلة Bash Automation التي تبدأ من Bash Automation & Scripting Essentials. في المقالة الثالثة من السلسلة ، سنناقش أيضًا إدارة عملية الخلفية المذكورة سابقًا في هذه المقالة.

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى