एक ऐसी प्रक्रिया को कैसे मारें जो बिना रिबूट किए नहीं मारी जा सकती?


11

ऐसी 5 प्रक्रियाएँ हैं जिन्हें मार नहीं सकते हैं kill -9 $PIDऔर निष्पादित करने cat /proc/$PID/cmdlineसे वर्तमान सत्र लटक जाएगा। शायद वे ज़ोंबी प्रक्रियाएं हैं।

निष्पादन ps -ef or htopवर्तमान सत्र को भी लटका देगा। लेकिन topऔर ps -eठीक काम कर रहे हैं।

तो ऐसा लगता है कि दो समस्याएं हैं, जो फाइल सिस्टम जवाब नहीं दे रहा है।

यह वर्चुअल मशीन चलाने वाली एक उत्पादन मशीन है, इसलिए रिबूटिंग एक विकल्प नहीं है।

निम्नलिखित प्रक्रिया आईडी काम नहीं कर रहे हैं: 16181 16765 5985 7427 7547

इन प्रक्रियाओं का जनक init है

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

और qemu प्रक्रियाओं में से एक काम नहीं कर रहा है

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
ज़ोंबी प्रक्रियाओं में समस्या नहीं होनी चाहिए। यदि ज़ोंबी प्रक्रियाओं की संख्या इतनी बड़ी है कि सर्वर पर प्रक्रिया की सीमा से अधिक है तो यह एक समस्या का कारण होगा।
रज़ा

@ सैलटन: हम ps -ef और htop का उपयोग नहीं कर सकते हैं इसलिए हमें कुछ समस्याएं मिलीं, हो सकता है कि हम जो देख रहे हैं उसे ज़ोंबी प्रक्रिया नहीं कहा जाता है?
सैम स्टोलिंगा

1
आप यह देखने के लिए उपयोग करके ट्रेस कर सकते /usr/bin/strace ps -efहैं कि वास्तव में आपका ps -efफांसी कहाँ है ।
रजा

2
आपने कैसे निर्धारित किया कि ये लाश हैं? यह बल्कि फांसी प्रक्रियाओं की तरह दिखता है। क्या ps -elकाम करता है और ये प्रक्रिया किस राज्य में है?
Nils

अंत में ग्राहक ने अभी भी मशीन को रिबूट करने का फैसला किया क्योंकि समस्याएं और बदतर हो रही थीं। सभी इनपुट के लिए आपको धन्यवाद। लाश और अबाधित प्रक्रियाओं के बारे में बहुत कुछ सीखा।
सैम स्टोलिंगा

जवाबों:


22

आपके पास लाश नहीं है। cat /proc/$PID/cmdlineएक ज़ोंबी के साथ कोई समस्या नहीं होगी। यदि kill -9प्रोग्राम को नहीं मारता है , तो इसका मतलब है कि प्रोग्राम कुछ निर्बाध I / O ऑपरेशन कर रहा है। यह आमतौर पर तीन चीजों में से एक को इंगित करता है:

  • एक नेटवर्क फाइल सिस्टम जो जवाब नहीं दे रहा है;
  • एक कर्नेल बग;
  • एक हार्डवेयर बग।

उपयोगिताएँ जैसे psहैंग हो सकती हैं यदि वे कुछ जानकारी को पढ़ने की कोशिश करती हैं जैसे कि प्रक्रिया निष्पादन योग्य पथ जो ऊपर दिए गए कारणों में से एक के लिए कर्नेल प्रदान नहीं कर रहा है।

cat /proc/16181/syscallयह देखने की कोशिश करें कि 16181 क्या प्रक्रिया कर रहा है। आपका सिस्टम कितना दूर चला गया है, इसके आधार पर यह काम कर सकता है या नहीं।

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


बिल्ली कभी जवाब नहीं देती। मुझे नहीं लगता कि यह एक बग है। मुझे लगता है कि यह एक "विशेषता" है।
उल्लू

7

अन्य उत्तर मान रहे हैं कि ये ज़ोंबी प्रक्रियाएं हैं। एक ज़ोंबी प्रक्रिया एक ऐसी प्रक्रिया है जो चल रही है, लेकिन माता-पिता के बाहर निकलने की स्थिति जानना चाहते हैं, लेकिन अभी भी प्रक्रिया तालिका में है। ये सामान्य हैं, और initस्वचालित रूप से ज़ोंबी प्रक्रियाओं को साफ करेंगे जो इसे सौंपा गया है।

ज़ोंबी प्रक्रियाओं को कभी भी लटकने का कारण नहीं होना चाहिए, इसलिए ऐसा लगता है कि आपकी समस्या नहीं हो सकती है। यदि यह एक सिस्टम कॉल या ड्राइवर लटका हुआ है, तो प्रक्रिया एक निर्बाध स्थिति में हो सकती है। यहाँ एक अच्छी व्याख्या है


बहुत सारी ज़ोंबी प्रक्रियाओं को forkसफल होने से रोका जा सकता है (जब मुश्किल हो nrpocजाती है) क्योंकि वे अभी भी प्रक्रिया तालिका में स्थान पर कब्जा कर लेते हैं।
dhchdhd

2

लिनक्स पर ज़ोंबी प्रक्रियाओं को खोजने के लिए:

$ ps axo स्टेट, ppid, pid, कॉम | grep -w दोषपूर्ण

जेड 555 10242 लानत-ज़ोंबी <विक्षेप>

सबसे पहले, आप ज़ोंबी कमांड की किल प्रक्रिया का उपयोग करके SIGCHLD सिग्नल भेजने की कोशिश कर सकते हैं। ध्यान दें कि उपरोक्त आदेश आपको प्रत्येक ज़ोंबी का PPID (मूल प्रक्रिया का पीआईडी) देता है। हमारे उदाहरण में, ज़ोंबी का पीपीआईडी ​​है 555

$ सूडो मार -s SIGCHLD 555

यदि एक ज़ोंबी प्रक्रिया अभी भी दूर नहीं जाती है, तो आप ज़ोंबी की मूल प्रक्रिया (जैसे, 555) को मार सकते हैं।

$ सूदो मार-९ ५५५

एक बार जब इसकी मूल प्रक्रिया समाप्त हो जाती है, तो ज़ोंबी को init प्रक्रिया द्वारा अपनाया जाएगा, जो कि लिनक्स में सभी प्रक्रियाओं का एक अभिभावक है। Init प्रक्रिया समय-समय पर wait()किसी भी ज़ोंबी प्रक्रिया को पुकारती है।


यही असली जवाब है। माता-पिता को मारने का काम किया, धन्यवाद।
एंड्रयू

1

आप केवल एक ज़ोंबी को उसके माता-पिता को मारकर मार सकते हैं। एक ज़ोंबी प्रक्रिया ने अपने सभी संसाधनों को जारी कर दिया है और वह अपने माता-पिता द्वारा अपनी निकास स्थिति का इंतजार कर रही है। यह एक ज़ोंबी बन जाता है जब माता-पिता waitअपने बच्चे से बाहर निकलने की स्थिति को लेने के लिए निष्पादित नहीं करते हैं। जब आप ज़ोंबी के माता-पिता को मारते हैं, initतो बाहर निकलने की स्थिति चुनती है और ज़ोंबी आखिरकार मर जाता है।


तो आप चाहते हैं कि मैं init को मार दूं? यह प्रश्न क्षमा करने से स्पष्ट नहीं है, लेकिन अभिभावक को यह गलत लगता है :( मैंने प्रश्न संपादित किया है।
सैम स्टोइलिंग

4
नहीं, हम चाहते हैं कि आप ज़ोंबी को मारने की कोशिश न करें। आप एक ज़ोंबी नहीं मार सकते। यह सामान्य प्रश्न यूनिक्स के समान ही पुराना है।
ट्रिपल जू

@tripleee: हाँ जो मुझे समझ में आया। शायद जो मैं कर रहा हूं वह कोई ज़ोंबी नहीं है। htop काम नहीं कर रहा है और बिल्ली / proc / $ pid / cmdline या ls / proc / $ pid / भी काम नहीं कर रहा है। आम तौर पर यह लाश के साथ ऐसा नहीं होता है, इसलिए मैंने यहां पूछा, यह आम समस्या नहीं है। मैंने कई उत्तरों की जाँच की है, जो सभी आपको माता-पिता को मारने के लिए कहते हैं, जो मेरे मामले में init या रिबूट करने के लिए है।
सैम स्टोइलिंगा

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