मैं सभी रुकी हुई नौकरियों को कैसे मार सकता हूं?


91

जब मैं अपने लिनक्स सर्वर से बाहर निकलने की कोशिश करता हूं तो मुझे संदेश मिलता है:

रुके हुए काम हैं।

: क्या इनको मारने का एक ही आदेश है?


Thie U & L Q & A में अतिरिक्त उदाहरण: unix.stackexchange.com/questions/124428/…
slm

मुझे अब विपरीत समस्या थी, जब मैंने शेल छोड़ दिया तो यह नौकरियों के बारे में चेतावनी नहीं देगा! shopt -s checkjobsमेरे .bashrc
सैम वाटकिंस

1
प्रेस ctrl + d फिर से, यह अब आपको बाहर निकलने देगा, इस प्रक्रिया में उन नौकरियों को मार देगा
जेन्स टिम्मरमैन

जवाबों:


73

बैश के तहत सभी रुकी नौकरियों को जल्दी से मारने के लिए, दर्ज करें:

kill -9 `jobs -ps`

jobs -ps-pरोकी गई ( -s) नौकरियों की प्रक्रिया आईडी ( ) को सूचीबद्ध करता है ।
kill -9 `jobs -ps`उन सभी को SIGKILL सिग्नल भेजता है।


22
-1 "किल जॉब्स" के लिए

1
जब काम "सूदो सु" नहीं था। यानी sudo kill `jobs -p`फ्लॉप काम लेकिन स्पष्ट रूप से टाइपिंग पीआईडी किया था।
user13107

14
यह बहुत ऊंचा क्यों है? यह गलत है। यदि प्रक्रियाओं को रोक दिया जाता है, तो killजैसे कि यह कुछ नहीं करेगा, क्योंकि प्रक्रियाएं रोक दी जाती हैं, वे SIGTERM (-15) को संसाधित नहीं करेंगे जो डिफ़ॉल्ट रूप से उन्हें भेजा जाता है।
स्लम

6
मारना -9 की चाल चलेगा।
टाइमऑफली

84

इसे टाइप करने का प्रयास करें:

kill -9 $(jobs -p)

9
यह करना चाहिए, लेकिन मुझे लगता है कि उसे SIGKILL (-9) भेजने से पहले पहले एक SIGTERM (-15) भेजना चाहिए। तो शायद "मार $ (नौकरी-पी), नींद 3 एस; हत्या -9 $ (नौकरी -पी)" जैसे कुछ का प्रस्ताव करना बेहतर होगा। SIGTERM को भेजने से पहले जॉब क्लीन एक्जिट (आवंटित संसाधनों को मुक्त करना, आदि) करने में सक्षम हो सकते हैं।
Rems

3
केविन ड्यूक, आपका जवाब वही है जो मेरे लिए काम करता है। मैं मतदान नहीं कर सकता क्योंकि मेरे पास प्रतिष्ठा में 15 नहीं हैं। किल -9 $ (नौकरी -पी)

2
@rems को छोड़कर, जैसा कि स्लम ने बताया, उन्हें SIGTERM नहीं मिलेगा क्योंकि वे रुके हुए हैं।
पॉल गियर


फिर, zsh से कैसे निपटें?
एफएक्स-किरीन

16

स्वीकृत उत्तर सभी नौकरियों को मार देगा (जो इस मामले में पर्याप्त है) और न केवल रुके हुए लोग। क्या आप केवल रूके हुए लोगों को मारना चाहते हैं, दौड़ें:

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

grep / cut को एक awk कमांड में जोड़ा जा सकता है: awk '/Stopped/{print $3}')
laebshade

2
-sस्वीकार किए जाते हैं जवाब फिल्टर बस बंद कर दिया वालों पर तर्क
79E09796

12

सबसे आसान तरीका वास्तव में तुरंत बाहर निकलने का प्रयास करना है; bashइसका मतलब यह होगा कि "सभी बंद नौकरियों और बाहर निकलें को मारें"।


4
यह एक HUP भेजेगा जो जरूरी नहीं कि किसी भी काम को रोक दे।
स्टीफन निदिज़ेल्स्की

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

2
आप इस लाइन के लिए कोड फ़ॉर्मेटिंग जोड़ सकते हैं ताकि इसे पढ़ना आसान हो सके।
ड्रेलस

क्या आप अपने स्वरूपण पर फिर से नज़र डाल सकते हैं - एक ब्लॉक को कोड के रूप में चिह्नित करने के लिए लाइन की शुरुआत में चार स्थानों का उपयोग करें (बैकटिक का उपयोग करने के बजाय)। अभी यह स्पष्ट नहीं है कि आप अपने कोड में backticks का उपयोग कर रहे हैं, या backticks का उपयोग करके कोड प्रदर्शित करने का प्रयास कर रहे हैं।
dunxd

स्वरूपण ठीक है। हमें नौकरियों को पास करना होगा-बैकटिक्स का उपयोग करके इसे कमांड के रूप में नहीं माना जाएगा, और यह एक त्रुटि फेंक देगा।
स्मारक

5

बस अगर यह किसी और की मदद करता है - ज्यादातर लोग यहां हैं क्योंकि उनके पास कुछ बंद प्रक्रियाएं हैं जो उन्होंने शुरू की थीं, शायद शेल के माध्यम से पृष्ठभूमि में। मुझे अन्य उपयोगकर्ताओं द्वारा रोकी गई प्रक्रियाओं को रूट के रूप में खोजने की आवश्यकता थी, जिसके लिए 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$कहता हूं, जो मुझे अंतिम कॉलम में टी की सभी प्रक्रियाएं दिखाता है।

और फिर मेरे पास अलग-अलग उपयोगकर्ताओं की सभी प्रक्रियाओं की एक अच्छी सूची है जो बंद अवस्था में हैं।

$ 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

वर्तमान शेल से जुड़ी नौकरियों को रोकना, jobs -psइस उत्तर की तुलना में सरल है। यह कहा जा रहा है, यह उत्तर केवल Ctrl-Zशेल में रोकी गई नौकरियों को नहीं दिखाता है , लेकिन सभी ने नौकरियों को रोक दिया है: अन्य शेल, अन्य उपयोगकर्ता , जिसमें डीबग किए जा रहे जॉब्स शामिल हैं (जैसे जीडीबी द्वारा)।
स्टीफन गौरिचोन

मेरे लिए सबसे अच्छा जवाब है, लेकिन बिल्कुल काम नहीं है। मुझे ps -el | grep Tराज्य 'टी' में प्रक्रियाओं को खोजने के लिए उपयोग करना था ।
dr0i

4

यदि आप कुछ रुकी हुई नौकरियों को निकालना चाहते हैं, लेकिन सभी नहीं, तो यह कोशिश करें:

सबसे पहले, नौकरियों की सूची बनाएं, आपको कुछ इस तरह मिलेगा:

$ 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

आम तौर पर यदि आपको वह संदेश मिला है, तो आपको दो बार लॉगआउट करने की आवश्यकता है। उदा। पहले Ctrl+Dआपको रुकी हुई नौकरियों के बारे में सूचित करने के लिए आपको चेतावनी संदेश देता है, दूसरी बार दबाने पर आप नौकरियों को मार देंगे। यह वही लागू होता है logoutऔर exitआदेश देता है।

उन्हें मैन्युअल रूप से मारने के लिए, प्रयास करें kill $(jobs -p):।


यदि आप अपने वर्तमान शेल से नौकरियों को मारना नहीं चाहते हैं, तो आप disownकमांड का उपयोग करके उन्हें बिना मारे सक्रिय नौकरियों की तालिका से निकाल सकते हैं । उदाहरण के लिए

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

रुकी हुई नौकरियों को भी प्रक्रिया ( Tचरित्र) की स्थिति से निर्धारित किया जा सकता है, जिसका अर्थ है कि इस प्रक्रिया को सिग्नल द्वारा रोक दिया गया था SIGSTOP, जैसे कि , SIGTSTPया अन्य (जैसे SIGTTIN, या SIGTTOU)।

यदि jobsशेल शेल कमांड उपलब्ध नहीं है, तो निम्नलिखित कमांड द्वारा रोकी गई प्रक्रियाओं को सूचीबद्ध किया जा सकता है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.