कैसे ज़ोंबी प्रक्रिया को मारने के लिए


183

मैंने अपने कार्यक्रम को अग्रभूमि (एक डेमन प्रोग्राम) में लॉन्च किया, और फिर मैंने इसे मार दिया kill -9, लेकिन मुझे एक ज़ोंबी शेष है और मैं इसे मारने में सक्षम नहीं हूंkill -9 । कैसे एक ज़ोंबी प्रक्रिया को मारने के लिए?

यदि ज़ोंबी एक मृत प्रक्रिया है (पहले से ही मारा गया), तो मैं इसे के आउटपुट से कैसे निकालूं ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]

2
क्या ps -o ppid 1163कहता है? अर्थात्, 1163 का जनक कौन है? यह वह प्रक्रिया है जिसे समाप्त किया जाना चाहिए।
विलियम पर्सेल

जवाबों:


247

एक ज़ोंबी पहले से ही मर चुका है, इसलिए आप इसे नहीं मार सकते। एक ज़ोंबी को साफ करने के लिए, इसका अपने माता-पिता द्वारा इंतजार किया जाना चाहिए, इसलिए माता-पिता को मारकर ज़ोंबी को खत्म करने का काम करना चाहिए। (माता-पिता की मृत्यु के बाद, ज़ोंबी को पीआईडी ​​1 विरासत में मिलेगा, जो उस पर इंतजार करेगा और प्रक्रिया तालिका में अपनी प्रविष्टि को साफ कर देगा।) यदि आपका डेमन बच्चों को पैदा कर रहा है जो लाश बन जाते हैं, तो आपके पास एक बग है। आपके बच्चों के मरने और waitउनके निकलने की स्थिति निर्धारित करने के लिए आपके डेमॉन को नोटिस करना चाहिए ।

इस बात का एक उदाहरण है कि आप हर प्रक्रिया को एक संकेत कैसे भेज सकते हैं, जो एक ज़ोंबी का जनक है (ध्यान दें कि यह बहुत कच्चा है और ऐसी प्रक्रियाओं को मार सकता है जो आप इरादा नहीं करते हैं। मैं इस तरह के स्लेज हथौड़ा का उपयोग करने की अनुशंसा नहीं करता हूं):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

1
यदि ज़ोंबी एक मृत प्रक्रिया है (पहले से ही मारा गया), तो मैं इसे के आउटपुट से कैसे निकालूं ps aux?
MOHAMED

185
अपने माता-पिता द्वारा ज़ोंबी का इंतजार किया जाना चाहिए। इसके अभिभावक का पता लगाएं और पता लगाएं कि वह अभिभावक अपने बच्चों पर ध्यान क्यों नहीं दे रहा है, फिर सामाजिक सेवाओं के साथ शिकायत दर्ज करें। ;)
विलियम पर्ससेल

1
यह मानते हुए कि आपके पास बहुत सारी लाश पैदा करने की प्रक्रिया है, यह ' kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
यूनीक

2
आम तौर पर, आप में माता-पिता मिल सकता है PPidपंक्ति आप अगरcat /proc/<pid>/status
डैनियल आंद्रेई Mincă

1
बस गैर-आईटी लोगों ने यहां आने और इसे पढ़ने की कल्पना की। पागल।
१२:४२ पर ZitRo

68

आप निम्नलिखित आदेश के साथ इसकी मूल प्रक्रिया को मारकर एक ज़ोंबी प्रक्रिया को साफ कर सकते हैं:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

6
यह कमांड प्रक्रिया तालिका से ज़ोंबी को साफ करता है, लेकिन यह ज़ोंबी को 'मार' नहीं देता है। लाश पहले ही मर चुकी है।
विलियम पर्ससेल

8
grepआवश्यक नहीं है। ps ... | awk '/[zZ]/{print $2}'
विलियम पर्ससेल

2
AFAICS, यह कमांड ज़ोंबी को नहीं मारता है, लेकिन अपनी मूल प्रक्रिया के लिए SIGHUP भेजता है (संभवतः माता-पिता को मार रहा है यदि वह SIGHUP को संभाल नहीं पाता है और इस कारण ज़ोंबी को पुन: प्रस्तुत करने में असमर्थ हो जाता है, जैसा कि पिछले उत्तर में वर्णित है)। तो इस आदेश के साथ सावधान रहें, यह कुछ ऐसी चीज को मार सकता है जिसकी आप उम्मीद नहीं कर रहे थे ...
मैथिज कोइजमैन

1
यह मेरे लिए काम नहीं किया। मैंने "किल
एचयूपी प्रोसेसिड

1
@WilliamPursell जब आप किसी प्रश्न का उत्तर देते हैं, तो कृपया कमांड लाइन का उपयोग करने के परिणाम का वर्णन करें और यह स्पष्ट रूप से क्या करता है क्योंकि यह कंप्यूटर पर चलने वाले सभी कार्यक्रमों को मारता है।
दलेक

39

मैंने कोशिश की:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

यह काम करेगा :)


im मेरे मामले में ज़ोंबी एक स्टार्ट-अप स्क्रिप्ट और एक प्रोग्राम के माध्यम से बना रहा था जिसे स्पष्ट रूप से हटाया नहीं गया था इसलिए मैंने इसे मंजूरी दे दी।
मोहम्मद रफ़ी

1
मेरे लिए काम किया। यह कुछ मामलों में काम करेगा जब डिफरेंशियल प्रक्रिया को एथेर मारे गए प्रक्रिया द्वारा प्रायोजित किया गया था।
एरिक एस। बुलिंगटन

2
मैंने जाँच की कि माता-पिता ने इसे मारने से पहले क्या प्रक्रिया की। और मैंने इसे सिर्फ -1: किल -9 {द पेरेंट आईडी} के बजाय -9 का उपयोग करके मार डाला
अली

मुझे भी -1 की बजाय खदान को मारने के लिए -9 का उपयोग करना पड़ा
माइकल स्मिथ

27

इसे http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/ पर मिला

2) यहाँ एक अन्य उपयोगकर्ता (Thxs बिल Dandreta) से एक महान टिप: कभी-कभी

kill -9 <pid>

एक प्रक्रिया को नहीं मारेंगे। Daud

ps -xal

चौथा क्षेत्र माता-पिता की प्रक्रिया है, एक ज़ोंबी के माता-पिता के सभी को मार डालो और ज़ोंबी मर जाता है!

उदाहरण

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583लाश कर रहे हैं -

kill -9 18581 18582 18583

कोई प्रभाव नहीं है।

kill -9 31706

लाश को हटाता है।


3
अच्छा है कि सिर्फ initमेरे लिए मारा गया है, और अब मैं कुछ नहीं कर सकता और फिर से शुरू करने के लिए मजबूर हूं ... ज़ोंबी प्रक्रिया जावा है, 4 जीबी में से
3.4GB

22

मैंने कोशिश की

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

और यह मेरे लिए काम करता है।

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