في ما أمر يجب أن ترسل إشارات إلى برشاقة إيقاف العمليات ؟

StackOverflow https://stackoverflow.com/questions/690415

سؤال

في التعليق على هذا الجواب آخر السؤال, فإن المعلق يقول:

لا تستخدم لقتل -9 إلا على الاطلاق من الضروري!SIGKILL لا يمكن أن تحصر لذلك قتل البرنامج لا يمكن تشغيل أي إيقاف إجراءات مثلمحو الملفات المؤقتة.أول محاولة HUP (1), ثم INT (2), ثم إنهاء (3)

أنا أتفق من حيث المبدأ عن SIGKILL, لكن بقية الخبر لي.بالنظر إلى أن التقصير من إشارة kill هو SIGTERM, أنا أتوقع أنه هو الأكثر شيوعا المتوقع إشارة لإيقاف تشغيل التعسفي العملية.كما رأيت SIGHUP تستخدم لغير إنهاء الأسباب ، مثل قول الشيطان "إعادة قراءة ملف config الخاص بك." و يبدو لي أن SIGINT (نفس يقطع لك عادة على Ctrl-C, صحيح؟) ليست معتمدة على نطاق واسع كما يجب أن يكون, أو إنهاء بدلا ungracefully.

بالنظر إلى أن SIGKILL هو الملاذ الأخير — وهو ما يشير ، في ما امر, ينبغي أن ترسل إلى التعسفي العملية ، من أجل إغلاقها بأمان قدر الإمكان ؟

يرجى إثبات إجاباتك مع دعم الحقائق (ما وراء تفضيل شخصي أو رأي) أو المراجع ، إذا كنت تستطيع.

ملاحظة:أنا مهتم بشكل خاص في أفضل الممارسات التي تشمل النظر باش/Cygwin.

تحرير: حتى الآن, لا أحد يبدو أن يذكر الباحث أو الإقلاع عن التدخين ، و هناك إشارة محدودة HUP.هل هناك أي سبب إدراج هذه بشكل منظم عملية القتل ؟

هل كانت مفيدة؟

المحلول

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

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

لمزيد من المعلومات حول ما المعنى الحقيقي من إشارات ، انظر sigaction(2).لا تخلط بين "الإجراء الافتراضي" مع "الوصف" ، فهي ليست نفس الشيء.

SIGINT يستخدم للإشارة إلى تفاعلية "لوحة المفاتيح المقاطعة" من هذه العملية.بعض البرامج يمكن التعامل مع الوضع بطريقة خاصة لغرض مستخدمي المحطة.

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

SIGKILL يستخدم قوة إزالة عملية من النواة.وهو خاص بمعنى أنه لم يكن في الواقع إشارة إلى العملية ولكن بدلا من ذلك يحصل على تفسير من قبل النواة مباشرة.

لا ترسل SIGKILL. SIGKILL بالتأكيد يجب أن لا يتم إرسال بواسطة البرامج النصية.إذا كان التطبيق يعالج SIGTERM, يمكن أن يستغرق ثانية إلى تنظيف ، يمكن أن يستغرق دقيقة واحدة ، يمكن أن يستغرق ساعة.اعتمادا على ما التطبيق إلى الحصول على القيام به قبل أن يصبح جاهزا لهذه الغاية.أي منطق هذا "يفترض"تطبيق تنظيف تسلسل اتخذت طويلة بما فيه الكفاية ولا يحتاج إلى اختصار أو SIGKILLed بعد X ثانية مجرد خطأ عادي.

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

على الرغم من نصف العالم عمياء يرسل SIGKILL بعد 5 ثوان انها لا تزال خاطئ شيء للقيام به.

نصائح أخرى

الجواب القصير:إرسال SIGTERM, 30 ثانية في وقت لاحق ، SIGKILL.هذا هو ارسال SIGTERM, انتظر قليلا (قد تختلف من برنامج إلى آخر ، قد تعرف النظام الخاص بك أفضل ، ولكن من 5 إلى 30 ثانية كافية.عند اغلاق الجهاز, قد ترى تلقائيا في انتظار ما يصل إلى 1'30s.لماذا العجلة يا بعد كل هذا؟), ثم إرسال SIGKILL.

الجواب المعقول: SIGTERM, SIGINT, SIGKILL هذا هو أكثر من كاف.هذه العملية سوف جدا وربما إنهاء قبل SIGKILL.

الجواب طويل: SIGTERM, SIGINT, SIGQUIT, SIGABRT, SIGKILL

هذا غير ضروري, ولكن على الأقل كنت لا مضللة عملية بخصوص الرسالة الخاصة بك.كل هذه الإشارات هل يعني تريد عملية لوقف ما تقوم به والخروج.

بغض النظر عن الإجابة التي تختارها من هذا التفسير أن تبقي في الاعتبار!

إذا قمت بإرسال إشارة إلى أن يعني شيئا آخر ، فإن عملية يمكن التعامل معها بطرق مختلفة جدا (من ناحية).من ناحية أخرى, إذا كانت العملية لا تحمل إشارة ، لا يهم ما كنت ترسل بعد كل عملية الإقلاع عن التدخين على أي حال (عندما الإجراء الافتراضي هو إنهاء بالطبع).

لذا يجب أن نفكر كما نفسك كمبرمج.هل كود وظيفة معالج, يتيح القول ، SIGHUP لإنهاء البرنامج الذي يربط بشيء أو هل حلقة إلى محاولة الاتصال مرة أخرى ؟ هذا هو السؤال الرئيسي هنا!هذا هو السبب في أنه من المهم أن مجرد إرسال إشارات يعني ما كنت تنوي.

تقريبا غبي الجواب طويل:

الجدول أدناه يحتوي على إشارات ذات الصلة ، الافتراضي الإجراءات في حالة البرنامج لا التعامل معها.

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

الإشارات مع النجمة (*) هي لا الموصى بها.الشيء المهم حول هذه هو أنك قد لا تعرف أبدا ما يتم برمجتها للقيام به.خصيصا SIGUSR!قد تبدأ apocalipse (وهو إشارة حرة على مبرمج فعل ما يريد!).ولكن إذا لم يتم التعامل معها أو في حالة غير المحتمل ان يتم التعامل إنهاء البرنامج سيتم إنهاء.

في الجدول ، مع إشارات الخيارات الافتراضية إلى إنهاء و توليد تفريغ الأساسية هي في نهاية, قبل SIGKILL.

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGTERM      15       Term    Termination signal
SIGINT        2       Term    Famous CONTROL+C interrupt from keyboard
SIGHUP        1       Term    Disconnected terminal or parent died
SIGPIPE      13       Term    Broken pipe
SIGALRM(*)   14       Term    Timer signal from alarm
SIGUSR2(*)   12       Term    User-defined signal 2
SIGUSR1(*)   10       Term    User-defined signal 1
SIGQUIT       3       Core    CONTRL+\ or quit from keyboard
SIGABRT       6       Core    Abort signal from abort(3)
SIGSEGV      11       Core    Invalid memory reference
SIGILL        4       Core    Illegal Instruction
SIGFPE        8       Core    Floating point exception
SIGKILL       9       Term    Kill signal

ثم أود أن أقترح هذا تقريبا غبي الجواب طويل: SIGTERM, SIGINT, SIGHUP, SIGPIPE, SIGQUIT, SIGABRT, SIGKILL

وأخيرا ،

بالتأكيد غبي طويل الإجابة:

لا تحاول ذلك في المنزل.

SIGTERM, SIGINT, SIGHUP, SIGPIPE, SIGALRM, SIGUSR2, SIGUSR1, SIGQUIT, SIGABRT, SIGSEGV, SIGILL, SIGFPE و إن عمل أي شيء ، SIGKILL.

SIGUSR2 يجب أن يحاكم من قبل SIGUSR1 لأننا أفضل حالا إذا كان البرنامج لا يتعامل مع الإشارة.و هو أكثر بكثير من المرجح أن التعامل مع SIGUSR1 إذا كان يتعامل مع واحد منهم فقط.

راجع للشغل, قتل:ليس من الخطأ أن ترسل SIGKILL إلى عملية أخرى والجواب ذكر.حسنا, أعتقد أن ما يحدث عند إرسال shutdown الأمر ؟ وسوف نحاول SIGTERM و SIGKILL فقط.لماذا تعتقد أن هذا هو الحال ؟ و لماذا كنت بحاجة إلى أي إشارات أخرى إذا shutdown يستخدم الأمر إلا هذين ؟


الآن مرة أخرى إلى الجواب طويل, هذا هو لطيف oneliner:

for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done

ينام لمدة 30 ثانية بين الإشارات.لماذا كنت في حاجة الى oneliner? ;)

كما أوصى:محاولة ذلك مع الإشارات 15 2 9 من الجواب المعقول.

السلامة:إزالة الثانية echo عندما كنت على استعداد للذهاب.أنا أسميها بلادي dry-run بالنسبة onliners.دائما استخدام اختبار.


السيناريو killgracefully

في الواقع أنا مفتون ذلك من خلال هذا السؤال أن قررت إنشاء برنامج نصي صغير أن تفعل ذلك تماما.أرجوك لا تتردد في تحميل (استنساخ) هنا:

جيثب رابط Killgracefully مستودع

عادة يمكنك أن ترسل SIGTERM, الافتراضي من قتل.إنه الافتراضي لسبب ما.إلا إذا كان البرنامج لا الاغلاق في كمية معقولة من الزمن يجب أن اللجوء إلى SIGKILL.ولكن مع ملاحظة أن SIGKILL البرنامج لا يوجد لديه إمكانية تنظيف الامور und البيانات يمكن أن يكون معطوبا.

أما بالنسبة SIGHUP, HUP لتقف على "شنق" و تاريخيا يعني أن المودم مفصول.هو أساسا ما يعادل SIGTERM.والسبب أن الشياطين في بعض الأحيان استخدام SIGHUP إلى إعادة تشغيل أو إعادة التكوين هو أن الشياطين فصل من أي التحكم في المحطات كما شيطان لا تحتاج تلك وبالتالي لن تتلقى SIGHUP, بحيث إشارة واعتبر أنها "حررت" للاستخدام العام.ليس كل الشياطين استخدام هذا تحديث!افتراضي عمل SIGHUP هو إنهاء العديد من الشياطين تتصرف بهذه الطريقة!لذلك لا يمكنك الذهاب عمياء إرسال SIGHUPs الشياطين و تتوقع منهم البقاء على قيد الحياة.

تحرير: SIGINT ربما من غير المناسب أن إنهاء العملية ، كما أنها عادة مرتبطة ^C أو أي محطة الإعداد لوقف البرنامج.العديد من برامج التقاط هذه لأغراض خاصة بهم ، لذلك هو شائع بما فيه الكفاية من أجل العمل. SIGQUIT عادة الافتراضي إنشاء تفريغ الأساسية ، إلا إذا كنت تريد الملفات الأساسية حول زرع ليس مرشح جيد أيضا.

موجز:إذا كنت ترسل SIGTERM و البرنامج لا يموت في غضون الإطار الزمني الخاص بك ثم إرساله SIGKILL.

SIGTERM يعني في الواقع إرسال طلب رسالة:"هل سيكون ذلك النوع من الانتحار".يمكن المحاصرين والتعامل معها من خلال تطبيق تنظيف تشغيل و إيقاف تشغيل التعليمات البرمجية.

SIGKILL لا يمكن المحاصرين من قبل التطبيق.التطبيق يحصل قتل من قبل نظام التشغيل دون أي فرصة من أجل التنظيف.

ومن المعتاد أن يرسل SIGTERM أولا النوم بعض الوقت ، ثم ترسل SIGKILL.

  • SIGTERM ما يعادل "طريق النقر على 'X' " في النافذة.
  • SIGTERM ما هو لينكس يستخدم الأولى ، عندما يتم إيقاف تشغيل.

مع كل هذا النقاش هنا ، أي رمز قد عرضت.هنا بلدي يأخذ:

#!/bin/bash

$pid = 1234

echo "Killing process $pid..."
kill $pid

waitAttempts=30 
for i in $(seq 1 $waitAttempts)
do
    echo "Checking if process is alive (attempt #$i / $waitAttempts)..."
    sleep 1

    if ps -p $pid > /dev/null
    then
        echo "Process $pid is still running"
    else
        echo "Process $pid has shut down successfully"
        break
    fi
done

if ps -p $pid > /dev/null
then
    echo "Could not shut down process $pid gracefully - killing it forcibly..."
    kill -SIGKILL $pid
fi

HUP يبدو القمامة لي.أود إرسالها إلى الشيطان إلى إعادة قراءة التكوين.

SIGTERM يمكن اعتراضها;الخاص بك الشياطين فقط قد يكون تنظيف التعليمات البرمجية لتشغيل عندما يتلقى هذه الإشارة.لا يمكنك أن تفعل ذلك SIGKILL.وهكذا مع SIGKILL كنت لا تعطي الشيطان المؤلف أي خيارات.

أكثر على ذلك في ويكيبيديا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top