سؤال ما الإجراء الذي يجب اتخاذه عندما يتعذر على Ctrl + C قتل العملية؟


السيطرة + C لا تعمل دائمًا لقتل العملية الحالية (على سبيل المثال ، إذا كانت هذه العملية مشغولة في عمليات شبكة معينة). في هذه الحالة ، سترى فقط "^ C" بواسطة المؤشر ولا يمكنك فعل أي شيء آخر.

ما هي أسهل طريقة لإجبار هذه العملية على الموت الآن دون أن تفقد طرفي؟

ملخص الإجابات: عادة ، يمكنك ذلك السيطرة + Z لوضع العملية للنوم ، ثم القيام به kill -9 _process-pid_، حيث تجد pid العملية مع ملاحظة وغيرها من الأدوات. على سحق (وربما قذائف أخرى) ، يمكنك القيام به kill -9 %1 (أو '٪ N' بشكل عام) وهو أسهل. إذا السيطرة + Z لا يعمل ، سيكون لديك لفتح محطة أخرى و قتل من هناك.


145
2018-02-09 08:49


الأصل


screen سيكون حلا ممكنا، مما يتيح لك إنشاء نافذة جديدة و kill العملية من هناك. - Bobby
على افتراض كنت بالفعل في شاشة :) - Dustin Boswell


الأجوبة:


لفهم مشكلة لماذا السيطرة + C لا يعمل ، من المفيد جدًا فهم ما يحدث عند الضغط عليه:

معظم القذائف ترتبط السيطرة + C لارسال " SIGINT إشارة إلى البرنامج الذي يعمل حاليًا في المقدمة ". يمكنك القراءة عن الإشارات المختلفة عبر إشارة رجل:

 SIGINT        2       Term    Interrupt from keyboard

يمكن للبرامج تجاهل هذه الإشارة ، كما يمكن تجاهلها SIGTSTP كذلك:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(وهو ما تفعله معظم القذائف عندما تضغط السيطرة + Z، وهذا هو السبب في أنها ليست مضمونة للعمل.)

هناك بعض الإشارات التي لا يمكن تجاهلها من خلال العملية: SIGKILL، SIGSTOP وبعض الآخرين. يمكنك إرسال هذه الإشارات عبر قتل أمر. لذلك ، لقتل عملية معلقة / zombieying الخاص بك ، ومجرد العثور على معرف العمليه (PID). على سبيل المثال ، استخدم pgrep أو ps وثم kill ما يلي:

 % kill -9 PID

102
2018-02-09 09:13



مجرد ملاحظة. حذار من أن "غيبوبة" هي حالة عملية من الناحية الفنية ، وليس هو نفسه ما كنت تقصد هنا "zombieying". (تم إنهاء العملية التي لم تنتظر () - إد من جانب الشركة الأم في الزومبي (Z) حالة. في هذه الحالة ، لا يمكنها معالجة الإشارات بعد الآن.) - Stéphane Gimenez
للأسف ، في بعض الأحيان ctrl + c ، ctrl + z ، و ctrl + \ all لا تفعل شيئًا ، والعملية قيد التراجع sudo (مسموح به بدون كلمة مرور) بحيث لا يمكنك فقط إرسال إشارة إلى العملية. - Michael


إذا السيطرة+C (SIGINT) لا يعمل ، حاول السيطرة+\ (SIGQUIT). ثم حاول السيطرة+Z (SIGTSTP). إذا كان هذا يعيدك إلى مطالبة shell ، فافعل ذلك kill على معرف العملية. (هذا الإعداد الافتراضي لإشارة SIGTERM ، والتي يمكنك تحديدها باستخدام kill -TERM. في بعض القذائف ، قد تتمكن من استخدامها %1 للإشارة إلى PID.) إذا لم يفلح ذلك ، فانتقل إلى محطة أخرى أو جلسة SSH وافعلها kill أو kill -TERM على معرف العملية. فقط كملاذ أخير يجب ان تفعل kill -KILL، a.k.a. kill -9نظرًا لأنه لا يمنح العملية أي فرصة للإجهاض بشكلٍ صحيح ومزامنة ملفاتها المفتوحة وإزالة ملفاتها المؤقتة وإغلاق اتصالات الشبكة وما إلى ذلك.


97
2018-02-09 09:36





اضغط على Ctrl-Z إلى تعليق البرنامج ووضعها في الخلفية:

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(استعادة إلى الأمام مرة أخرى باستخدام fg)

إذا تستطيع kill أو kill -9 ذلك ، نظرا لمعرف العملية الخاص به (تحصل عليه من ps a).


27
2018-02-09 08:53



مع باش يمكنك kill $!، مثل $! هو متغير خاص يحتوي على معرف برنامج آخر الخلفية. - Lloeki
Lloeki لا يعمل بالنسبة لي (على الأقل لا يمكن الاعتماد عليها). على أن bg مرة واحدة قبل أن يحصل المتغير على قيمة معينة. - Daniel Beck♦
@ دانيال ، صحيح. هو كما قلت الأخير backgrounded العملية ، وبالتالي يحتاج bg مثل الحق بعد Ctrl + Z يتم تعليقه فقط. - Lloeki
ملاحظة: هذه ليست مجرد خدعة ، باستخدام ps الإخراج (أو killall) مخاطرة كبيرة إذا كان لديك عمليات متعددة بنفس الاسم قيد التشغيل. ps -e -o pid,command سيقدم pid + args كاملة ، وليس فقط اسم البرنامج ، ولكن مرة أخرى قد لا يكون كافيا للتمييز. في المقابل $! هو ضرب أكيد. - Lloeki
Lloeki أنا لا أوافق. خط الانتاج المثال من ps a على نظامي: 27721 s000 T 0:00.09 top كم عدد المعلقين (T، أعتقد) حالات من نفس الأمر (top) هل لديك تشغيل في نفس tty (s000)؟ - Daniel Beck♦


انظر الى هذا حلقة الوصل كذلك.

السيطرة+Z: وقفة عملية.

السيطرة+C: اطلب بأدب من العملية أن تغلق الآن.

السيطرة+\: أقتل بلا رحمة العملية التي هي حاليا في المقدمة


23
2018-06-19 03:03





عادة ، لا يزال بإمكانك إيقاف العملية (السيطرة + Z) ومن ثم استخدام kill -9. إلى عن على kill -9تحتاج الى عملية PID أول. لوظائف الخلفية ، kill -9 %1 أسهل طريقة للقيام بذلك - إذا كنت غير متأكد من رقم الوظيفة الأساسية التي تريد أن تقتلها ، قم بتشغيلها jobs.

بدلاً من ذلك ، يمكنك العثور على معرف العملية باستخدام

ps

ثم يمكنك تشغيل

kill -9 <Appropriate PID from ps output>

12
2018-02-09 08:53





1) إذا كنت في وحدة التحكم وفي وضع المستخدمين المتعددين ، فيمكنك الضغط على CTRL-ALT-Fn وتسجيل الدخول على شاشة أخرى ، استخدم ps -ef | grep <myprocessname> أو pidof <myprocessname> ثم قتل -9 العملية عن طريق رقم الهوية.

2) إذا كنت متصلاً عن بعد ، فقم بالمثل عن طريق جلسة طرفية أخرى.

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

3) إذا كنت عالقة في جلسة ssh معلقة (إلى نظام آخر ، على سبيل المثال) ، حاول الضغط على التلدة (~) ، وهو مفتاح الهروب ، ثم اضغط على CTRL-Z للعودة إلى جلسة المضيف ، ثم يمكن أن تقتل عملية ssh عالقة أو الانتظار حتى انتهاء المهلة ، والتي تفعل معظم بعد عتبة فترة من عدم النشاط.


4
2018-02-09 09:01





إن الحل البسيط لـ Bash (والأصداف الأخرى) هو:

Ctrl-z      followed by     kill -9 %1

حيث يشير "٪ 1" إلى رقم الوظيفة الذي تم قتله. قد يكون '٪ 2' (أو أي شيء آخر) إذا كان لديك بالفعل وظائف أخرى تنام. يمكنك معرفة أي رقم مهمة يكون عند النقر على Ctrl-z:

[1]+  Stopped                 <process name>

لاحظ أن 'kill' هي نسخة shell من kill ، وليس / bin / kill.


3
2018-04-18 10:41





إذا كنت تستخدم tmux أو شاشة ، ولا شيء من الأعمال المذكورة أعلاه ، فلا يزال بإمكانك قتل الجزء من قبل <prefix> x، ثم يتم قتل العملية أيضا.


0
2017-10-26 13:16





هناك ربما مجموعة الفخ مع SIGINT (2) في الملف / etc / profile. إذا كان الأمر كذلك ، فقم بإزالته. الخروج وإعادة تسجيل الدخول ويجب أن تكون جيدًا.


0