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


19

मैंने अभी कुछ ज़ोंबी प्रक्रियाओं को CentOS 6.8 (अंतिम) पर देखा, उन्हें मारने की कोशिश की, लेकिन वे अभी भी वहां हैं:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

जैसा कि आप देख सकते हैं कि वे दो महीने से चल रहे हैं, और अगर वे हानिकारक नहीं हैं, तो मैं उनसे छुटकारा पाऊंगा, जो कि ज़ोंबी को मारने का कोई वैकल्पिक तरीका है?


1
क्या आपने कोशिश की है kill -9?
इपोर सिरसीर

7
केवल 747और 29971ज़ोंबी प्रक्रियाएं हैं। दूसरों को बंद किया जा सकता है, लेकिन वे अभी तक मर नहीं रहे हैं।
रोएमा

लगता है कि आप कुछ कोड में एक बग पर चल रहे हैं ...
बोरिस स्पाइडर

जवाबों:


8

जैसा कि हेमायल ने उल्लेख किया है, आप वास्तव में एक ज़ोंबी को नहीं मार सकते। यह पहले से ही [संयुक्त राष्ट्र] मृत है ...

हालाँकि, आप जिस समस्या का सामना कर रहे हैं वह git cloneकमांड के साथ समस्या की तरह लग रही है । यह किसी तरह अटक जाता है। संभवत: बार बाहर या किसी अन्य तरीके से विफल रहता है? यह अक्सर कुछ I / O के कारण होता है कि एक प्रक्रिया उस बिंदु पर अटक जाती है जहां ए SIGTERMऔर SIGINTकाम नहीं करेगा।

इसे मारने के लिए, इस मामले में, आप -9कमांड लाइन विकल्प का उपयोग करना चाहते हैं । इसका मतलब है कि SIGKILLसिग्नल भेजें । आप वास्तव में -KILLभी उपयोग कर सकते हैं।

[root@host user]# kill -KILL 746 29970

उपलब्ध संकेतों की सूची प्राप्त करने के लिए, सूची कमांड लाइन विकल्प का उपयोग करें।

[root@host user]# kill -l

यह आपको संख्या और नाम दिखाता है (और आप देखेंगे कि # 9 SIGKILL कहते हैं।)


1
वास्तव kill -KILLमें इन प्रक्रियाओं को बंद करने में सक्षम एकमात्र आदेश था, इस कारण से मैं @Alexis विलके उत्तर को स्वीकार करने जा रहा हूं। लेकिन निश्चित रूप से मैं @heemayl को त्वरित, बुद्धिमान और बहुत जानकारीपूर्ण उत्तर +1 के लिए आभार व्यक्त करना चाहूंगा। सभी के लिए धन्यवाद
10

39

आप एक ज़ोंबी (प्रक्रिया) को नहीं मार सकते, यह पहले से ही मृत है। यह सिर्फ अपनी मूल प्रक्रिया की प्रतीक्षा कर रहा है wait(2)और अपनी निकास स्थिति को इकट्ठा कर रहा है। यह प्रोसेस टेबल एंट्री के अलावा सिस्टम पर कोई संसाधन नहीं लेगा।

आप SIGCHLDअपने अभिभावक को यह बताने के लिए भेज सकते हैं कि उसके बच्चों में से एक ने समाप्त कर दिया है (यानी बच्चे के निकास की स्थिति को इकट्ठा करने के लिए अनुरोध करें)। इस संकेत को अनदेखा किया जा सकता है (जो कि डिफ़ॉल्ट है):

kill -CHLD <PPID>

( <PPID>माता-पिता के वास्तविक पीआईडी ​​के साथ बदलें ।)

या आप मूल प्रक्रिया को मार सकते हैं ताकि init(पीआईडी ​​1) ज़ोंबी प्रक्रिया को विरासत में मिले और इसे ठीक से काट सके (यह initकिसी भी अनाथ को विरासत में देने और wait(2)नियमित रूप से करने के लिए मुख्य कार्यों में से एक है)। लेकिन माता-पिता को मारने की सिफारिश नहीं की जाती है। आम तौर पर, ज़ोंबी प्रक्रियाओं का निर्माण प्रोग्रामिंग समस्या / मुद्दों को इंगित करता है, और आपको इसके बजाय इसे ठीक करने या रिपोर्ट करने का प्रयास करना चाहिए।


8
आप यह बताने के लिए माता-पिता को SIGCHLD भेज सकते हैं कि एक अगर यह बच्चों को समाप्त कर दिया गया है (यानी बच्चे के निकास की स्थिति को इकट्ठा करने का अनुरोध करें), तो इस संकेत को अनदेखा किया जा सकता है (डिफ़ॉल्ट) इसके साथ समस्या यह है कि यदि कोई प्रक्रिया अनदेखा करती है SIGCHLD, तो कोई ज़ोंबी नहीं बनाया जाएगा। तो अगर यह अनदेखा नहीं कर रहा है SIGCHLD, और लाश का क्षय नहीं हो रहा है, तो प्रक्रिया या तो छोटी है या ज़ोंबी बच्चों की परवाह नहीं करती है। प्रश्न में प्रक्रिया को देखते हुए git clone ..., मैं शर्त लगा रहा हूं कि यह ज़ोंबी बच्चों के बारे में परवाह नहीं करता है क्योंकि यह एक (उम्मीद है) अल्पकालिक प्रक्रिया है जो अपना काम करता है और फिर बाहर निकलता है।
एंड्रयू हेनले

1
@AndrewHenle: जबकि यह ज्यादातर सच है, डिफ़ॉल्ट कार्रवाई ( SIG_DFL) SIGCHILDभी इसे अनदेखा करने के लिए है, लेकिन इस मामले में सबसे निश्चित रूप से लाश स्वचालित रूप से काट नहीं है।
आर ..

@R जबकि यह ज्यादातर सच है, डिफ़ॉल्ट कार्रवाई ( SIG_DFL) SIGCHILDभी इसे अनदेखा करने के लिए है, लेकिन इस मामले में सबसे निश्चित रूप से लाश स्वचालित रूप से काट नहीं है। मुझे यकीन नहीं है कि आप किस बारे में बात कर रहे हैं। क्या आप उन प्रक्रियाओं का जिक्र कर रहे हैं जिन पर सवाल नहीं उठाए जा रहे हैं? मैं यह नहीं देख रहा हूं SIGCHLDकि ऐसी प्रक्रिया को कैसे भेजा जा सकता है जिसके SIGCHLDहैंडलर को SIG_IGN(या तो स्पष्ट रूप से या डिफ़ॉल्ट रूप से) सेट किया गया हो, वह प्रक्रिया किसी भी लाश को वापस लाने का कारण होगी।
एंड्रयू हेनले

1
@AndrewHenle, इस समयSIGCHLD काम कर सकता है । पिछली बार यह सिग्नल छूट गया हो या एक ही समय में दो बच्चों की मौत हो गई हो और कोड इतना स्मार्ट न हो कि एक साथ दोनों मौतों को संभाल सके।
एलेक्सिस विल्के

यह चोट नहीं पहुंचा सकता है, लेकिन मैं इस पर काम नहीं करूंगा।
बमर

2

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

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

ज़ोंबी प्रक्रिया को मारने के लिए, माता-पिता की आईडी को मारने की आवश्यकता है अर्थात PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

जब एक माता-पिता की प्रक्रिया मर जाती है, तो सभी ज़ोंबी प्रक्रिया साफ हो जाएगी। सिर्फ ज़ोंबी प्रक्रिया को साफ करने के लिए मूल प्रक्रिया को मत मारो। यह तब आएगा जब आप अपना कार्यक्रम फिर से चलाएंगे। "प्रतीक्षा ()" या "वाट्सएप ()" सिस्टम कॉल को ठीक से कॉल करने के साथ अपने कार्यक्रम को ठीक करें।

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