سؤال كيف يمكنني قتل جميع الوظائف المتوقفة؟


عندما أحاول الخروج من خادم لينكس الخاص بي ، أحصل على الرسالة:

هناك وظائف توقفت.

: هل هناك أمر واحد لقتل هذه؟


80
2018-02-25 10:07


الأصل


أمثلة إضافية في الأسئلة والأجوبة الخاصة بـ U & L: unix.stackexchange.com/questions/124428/... - slm
كانت لدي مشكلة معاكسة الآن ، ولن أحذر من توقف الوظائف عندما أغادر القوقعة! كان على وضع shopt -s checkjobs في بلادي - Sam Watkins
اضغط ctrl + d مرة أخرى ، وسوف تتيح لك الخروج الآن ، مما أسفر عن مقتل تلك الوظائف في هذه العملية - Jens Timmerman


الأجوبة:


للقضاء بسرعة على جميع الوظائف التي تعمل تحت bash ، أدخل:

kill `jobs -ps`

jobs -ps معرف عملية القائمة من الوظائف المتوقفة. kill `jobs -ps` إرسال إشارة TERM لجميع الوظائف التي توقفت.


69
2018-02-25 10:15



-1 لـ "قتل الوظائف" - Tibor
لم يعمل عندما كانت الوظيفة "sudo سو". أي sudo kill `jobs -p` لم يعمل ولكن كتابة PID بشكل واضح. - user13107
لماذا هذا upvoted عاليا جدا؟ هذا خطأ. إذا توقفت العمليات ، ثم أ kill مثل هذا لن يفعل شيئًا ، حيث يتم إيقاف العمليات ، لن يقوموا بمعالجة SIGTERM (-15) التي يتم إرسالها إليهم بشكل افتراضي. - slm
قتل -9 سوف تفعل خدعة. - Blossoming_Flower
إجابة خاطئة بوضوح! - mrangry777


جرب كتابة هذا:

kill -9 $(jobs -p)

76
2018-02-25 10:14



يجب أن يفعل ذلك ، ولكن أعتقد أنه يجب أن يرسل أولاً SIGTERM (-15) قبل إرسال SIGKILL (-9). لذلك ربما يكون اقتراح شيء ما مثل "قتل $ (وظائف -p) ؛ النوم 3s ؛ قتل -9 دولار (وظائف -p)" سيكون أفضل. إرسال SIGTERM أولاً قد تكون الوظائف قادرة على القيام بخروج نظيف (تحرير الموارد المخصصة ، إلخ). - rems
كيفن ديوك ، إجابتك هي التي عملت من أجلي. لم أتمكن من التصويت لأنني لا أملك 15 سمعة. kill -9 $ (وظائف -p)
rems باستثناء ، كما أشار إلى ذلك ، فإنهم لن يحصلوا على SIGTERM لأنهم يتوقفون. - Paul Gear
لا يعمل على zsh. بسبب zsh لا يجري POS  تاسع مع الوظائف. - Max Coplan


الجواب المقبول سيقتل جميع الوظائف (وهو ما يكفي في هذه الحالة) وليس فقط تلك التي توقفها. إذا كنت تريد قتل فقط متوقف ، قم بتشغيل:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

16
2018-03-08 18:04



يمكن دمج grep / cut في أمر awk واحد: awk '/Stopped/{print $3}') - laebshade
ال -s حجة على الإجابة المقبولة المرشحات فقط تلك التي توقفها - 79E09796


أسهل طريقة هي في الواقع إعادة محاولة الخروج على الفور. bash سوف يأخذ ذلك ليعني "قتل جميع الوظائف المتوقفة والخروج".


12
2018-03-08 18:13



هذا سوف يرسل HUP الذي لا يوقف بالضرورة أي وظائف. - Stephen Niedzielski


for x in `jobs -p` ; do kill -9 $x ; done

7
2018-02-26 10:22



يمكنك إضافة تنسيق التعليمات البرمجية لهذا الخط لتسهيل قراءته. - drcelus
يمكنك إلقاء نظرة على التنسيق الخاص بك مرة أخرى - استخدم أربع مسافات في بداية السطر لوضع علامة على كتلة كرمز (بدلا من استخدام backtick). في الوقت الحالي ، ليس من الواضح ما إذا كنت تستخدم backticks في التعليمات البرمجية الخاصة بك ، أو تحاول عرض التعليمات البرمجية باستخدام backticks. - dunxd
التنسيق على ما يرام. لدينا لتمرير الوظائف -p باستخدام backticks آخر لن تنظر كقيادة ، وسوف يلقي خطأ. - monu


إذا كنت ترغب في إزالة بعض الوظائف التي توقفت عن العمل وليس كلها ، فجرّب ذلك:

أولا ، وظائف القائمة ، سوف تحصل على شيء من هذا القبيل:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

إرسال قتل إلى وظيفة متوقفة ، وسوف تفعل شيئا سوى طابور من إدخالها في المقدمة ، ستنتهي

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4
2018-05-30 04:16





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

لقتلهم يدويًا ، حاول: kill $(jobs -p).


إذا كنت لا ترغب في قتل وظائف من صدرك الحالي ، يمكنك إزالتها من جدول المهام النشطة دون قتل باستخدام disown أمر. مثلا

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

كما يمكن تحديد الوظائف المتوقفة من خلال حالة العملية (T الحرف) مما يعني أن العملية توقفت عن طريق إشارة مثل SIGSTOP، SIGTSTP أو غيرها (مثل SIGTTINأو SIGTTOU).

في حال متى jobs الأمر shell builtin غير متوفر ، يمكن تسجيل العمليات التي تم إيقافها بواسطة الأمر التالي:

ps wuax | awk '$8 ~ "T"'

لقتلهم جميعًا ، يمكنك بشكل أساسي كتابة:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

هنا إختبار بسيط:

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000

4
2018-02-19 20:46





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

قليلا من الحفر مع man ps حصلت لي على هذا:

ps -a -o pid,user,cmd,state | grep 'T$'

شرح: -a يقول العلم تظهر جميع العمليات ، ثم -o ضوابط الانتاج ، ما هي المعلومات التي ستظهر عن كل عملية. أنا أختار pid، user، cmd (سطر الأوامر) و state، وهو حالة العملية.

من عند man ps:

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

وأخيراً أقوم بتوصيله grep T$ الذي يقول ، أرني كل العمليات التي لها T في العمود الأخير.

ثم لدي قائمة لطيفة من جميع العمليات من مستخدمين مختلفين في حالة التوقف.

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

4
2018-02-26 06:47



للحصول على وظائف متوقفة متصلة بقشرة التيار ، jobs -ps أبسط من هذه الإجابة. ومع ذلك ، فإن هذه الإجابة لا تظهر فقط توقف العمل عن طريق Ctrl-Z في قذيفة ، ولكن جميع توقفت عن العمل: قذائف أخرى ، مستخدمين آخرين، بما في ذلك الوظائف الجاري تصحيحها (مثل gdb). - Stéphane Gourichon