एक <defunct> प्रक्रिया क्या है, और यह क्यों नहीं मारा जाता है?


180

क्रोम ब्राउज़र उत्तरदायी नहीं था और मैंने इसे मारने की कोशिश की थी, लेकिन गायब होने के बजाय प्रक्रिया <defunct>अपने अधिकार में थी, और इसे नहीं मारा:

यहां छवि विवरण दर्ज करें

<defunct>एक प्रक्रिया के लिए क्या है और यह क्यों नहीं मारा जाता है?


3
स्वीकृत उत्तर में उल्लेख है कि " kill -9 PIDकाम नहीं करते"। यह आंशिक रूप से सच है: वास्तव में, कोई मार काम नहीं करेगा। इसके अलावा, -9 को अंतिम उपाय के रूप में इस्तेमाल किया जाना चाहिए। समय की 99% मूल प्रक्रिया की एक डिफ़ॉल्ट हत्या इसे मार देगी और सभी बच्चों को काट देगी। एक "डिफ़ॉल्ट मार" एक SIGTERM (-15) है। मैं -9 (SIGKILL) के प्रशंसकों को stackoverflow.com/questions/690415/…
माइक एस

जवाबों:


172

आपके आउटपुट से हमें एक "डिफेक्ट" दिखाई देता है, जिसका अर्थ है कि यह प्रक्रिया या तो अपना कार्य पूरा कर चुकी है या दूषित हो गई है या मार दी गई है, लेकिन इसकी बाल प्रक्रियाएँ अभी भी चल रही हैं या ये मूल प्रक्रिया इसकी बाल प्रक्रिया की निगरानी कर रही है। इस तरह की प्रक्रिया को मारने के लिए, -9 PID काम नहीं करता है। आप उन्हें इस आदेश के साथ मारने की कोशिश कर सकते हैं लेकिन यह बार-बार यह दिखाएगा।

निर्धारित करें कि इस विवादास्पद प्रक्रिया की मूल प्रक्रिया क्या है और इसे मार दें। यह जानने के लिए कमांड चलाएँ:

ps -ef | grep defunct

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

फिर kill -9 637 27872, तब सत्यापित करें कि डिफंक्शन प्रक्रिया समाप्त हो गई है ps -ef | grep defunct


13
आप "दोषपूर्ण" प्रक्रिया को नहीं मार सकते। आप केवल उसके माता-पिता को मारकर प्रक्रिया तालिका में उसके प्रवेश को हटा सकते हैं।
20

57
क्या होगा अगर ppid है 1( init)? मान लीजिए, मुझे बस इंतजार करना होगा?
ल्यूक

7
मारने को स्वचालित करने के लिए, आप यह भी कर सकते हैं, (हो सकता है कि जो बाइट्स आप आउटपुट से काट रहे हैं उसे बदलने की आवश्यकता हो):ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
वॉरेन

3
@warren धन्यवाद। तुम भी थोड़ा छोटा और (imo) एक दूसरे grep नहीं कर सरल बना सकते हैं। बस पहले grep को grep [d]efunctया समान में बदलें और यह स्वयं से मेल नहीं खाएगा।
Thor84no

4
@warren आप एक अशुद्ध प्रक्रिया को नहीं मार सकते हैं- यहां तक ​​कि किसी SIGKILL के साथ भी। इसके अलावा, आप अंधाधुंध तरीके से किल -9 का उपयोग कर रहे हैं। Stackoverflow.com/questions/690415/… देखें । यदि आप अयोग्य बच्चों को मारना चाहते हैं, तो आप कोशिश कर सकते हैं parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill:। kill -9यदि आप चाहें तो 30 सेकंड के बाद स्क्रिप्ट को फिर से चलाएँ । (ध्यान दें कि मैं विशेष रूप से हत्या को खारिज करता हूं Init)
माइक एस

60

मैनुअल पेज ps (1) कहता है :

चिह्नित <defunct>प्रक्रियाएं मृत प्रक्रियाएं हैं (तथाकथित "लाश" ) जो बनी हुई हैं क्योंकि उनके माता-पिता ने उन्हें ठीक से नष्ट नहीं किया है। init(8)यदि मूल प्रक्रिया से बाहर निकल जाता है तो ये प्रक्रियाएँ नष्ट हो जाएँगी ।

आप इसे नहीं मार सकते क्योंकि यह पहले से ही मर चुका है। केवल एक ही चीज़ प्रक्रिया तालिका में एक प्रविष्टि है :

यूनिक्स और यूनिक्स जैसे कंप्यूटर ऑपरेटिंग सिस्टम पर, एक ज़ोंबी प्रक्रिया या डिफंक्ट प्रक्रिया एक ऐसी प्रक्रिया है जिसने निष्पादन को पूरा कर लिया है लेकिन अभी भी प्रक्रिया तालिका में एक प्रविष्टि है। यह प्रविष्टि अभी भी आवश्यक है कि माता-पिता प्रक्रिया को अपने बच्चे की निकास स्थिति को पढ़ने की अनुमति दें।

ऐसी प्रक्रियाओं को होने देने में कोई बुराई नहीं है जब तक कि उनमें से कई नहीं हैं। ज़ोंबी अंततः अपने माता-पिता द्वारा पुकारा जाता है (कॉल करके wait(2))। यदि मूल माता-पिता ने इसे अपने निकास से पहले नहीं निकाला है तो initप्रक्रिया ( pid == 1) कुछ समय बाद करती है। ज़ोंबी प्रक्रिया सिर्फ है:

एक प्रक्रिया जिसे समाप्त कर दिया गया है और जिसे तब हटा दिया गया है जब इसकी निकास स्थिति किसी अन्य प्रक्रिया को बता दी गई है जो उस प्रक्रिया को समाप्त करने की प्रतीक्षा कर रही है।


1

धन्यवाद माइक एस। हमने आपकी लाइन ले ली और एक स्क्रिप्ट लिखी जो कि विवादास्पद प्रक्रियाओं को मार देगी, जिनके माता-पिता in.telnetd हैं। हम इसे किसी भी मूल प्रक्रिया को मारने के लिए नहीं चाहते थे, बस हमें पता है कि एक समस्या पैदा हो रही है और हम इसे कई बार चलाएंगे ताकि जरूरत पड़ने पर कई लोगों को मार सकें।

# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.

first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"

# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
        echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
        echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
        kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi

1

पैडिंगटन के उत्तर पर विस्तार ।।

आपके आउटपुट से हमें एक दोष दिखाई देता है , जिसका अर्थ है कि इस बच्चे की प्रक्रिया ने या तो अपना कार्य पूरा कर लिया है या दूषित या मार दिया गया है। इसकी मूल प्रक्रिया अभी भी चल रही है और इसने अपने मृत बच्चे पर ध्यान नहीं दिया है।

kill -9 PID काम नहीं करेगा (पहले से ही मृत)।

इस बच्चे की प्रक्रिया के माता-पिता को निर्धारित करने के लिए, यह आदेश चलाएँ:

ps -ef | grep defunct

 UID  PID **PPID** C STIME TTY TIME     CMD
 1000 637  27872   0 Oct12 ?   00:00:04 [chrome] <defunct>

देखें कि जनक कौन है: ps ax | grep 27872

यदि आप चाहते हैं कि आप माता-पिता को मार सकते हैं, और दोष दूर हो जाएगा। kill -9 27872

अधिक तकनीकी तर्क के लिए जेएफ सेबेस्टियन का जवाब देखें।


1

@ पैडिंगटन के उत्तर में जोड़ते हुए, मैंने त्वरित जाँच के लिए इस फ़ंक्शन को अपने bashrc में जोड़ा:

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

यह कुछ इस तरह का उत्पादन करता है:

बच्चे:
UID PID PPID C STIME TTY समय सीएमडी
उपयोगकर्ता 25707 25697 0 फ़रवरी 26 अंक / 0 00:00:00 [sh] 
उपयोगकर्ता 30381 29915 0 11:46 pts / 7 00:00:00 ग्रीप दोष
------------------------------
माता-पिता:
25697 पीटीएस / 0 00:00:00 एनपीएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.