2011-12-16 17 views
18

किसी ने मुझे बताया कि जब आपने लिनक्स में माता-पिता की प्रक्रिया को मार दिया, तो बच्चा मर जाएगा।
लेकिन मुझे शक है। इसलिए मैं दो बैश लिपियों, जहां father.sh आह्वान होगा child.shलिनक्स में मूल प्रक्रिया की हत्या के बाद बाल प्रक्रिया अभी भी जिंदा क्यों है?

यहाँ लिखा था मेरी स्क्रिप्ट है:

enter image description here

अब मैं चलाने bash father.sh, आप जांच कर सकता है यह ps -alf enter image description here

तो मैं मार डाला father.shkill -9 24588 द्वारा, और मैंने अनुमान लगाया कि बाल प्रक्रिया समाप्त होनी चाहिए लेकिन दुर्भाग्य से मैं गलत था। enter image description here

क्या कोई बता सकता है क्यों?

THX

+5

मुझे लगता है कि आप 80% टेक्स्ट और सभी चित्रों को काट सकते हैं और अभी भी इस प्रश्न में महत्वपूर्ण सब कुछ रख सकते हैं। – ndemou

उत्तर

26

नहीं है, जब आप एक प्रक्रिया अकेले मार, यह बच्चों को मारने नहीं होंगे।

आप प्रक्रिया समूह को संकेत भेजने के लिए अगर आप

kill -9 -parentpid 

अन्यथा संकेत प्राप्त करने एक समूह के लिए सभी प्रक्रियाओं चाहते हैं, अनाथ के रूप में अपने तिहाई से दिखाया गया है, init से लिंक किया जाएगा स्क्रीनशॉट (बच्चे का पीपीआईडी ​​1 बन गया है)।

+0

जहां 'द्विपक्षीय' आमतौर पर मूल प्रक्रिया का पीआईडी ​​होता है, लेकिन 'ps -eo "% p% r% c% का उपयोग करके निश्चित रूप से" "पाया जा सकता है। +1। –

+0

प्रक्रिया समूह आईडी मूल आईडी के समान है। क्या आप उन्हें –

+13

को रोकने के तरीके के बारे में अधिक जानकारी दे सकते हैं, अगर यह स्पष्ट नहीं है तो फेज के कमांड को स्पष्ट करने के लिए, आप मूल आईडी में ऋणात्मक संख्या के रूप में गुजर रहे हैं, उदा। यदि पैरेंट पिड 1234 है, तो आप मारना चाहते हैं -1234 – frankc

4

-bash: मारने: (-123) - ऐसा कोई प्रक्रिया

एक इंटरैक्टिव Terminal.app सत्र में अग्रभूमि प्रक्रिया समूह आईडी नंबर और पृष्ठभूमि प्रक्रिया समूह आईडी नंबर जब काम डिजाइन द्वारा अलग हैं नियंत्रण/मॉनिटर मोड सक्षम है। दूसरे शब्दों में, यदि आप जॉब-कंट्रोल सक्षम टर्मिनल.एप सत्र में कमांड को पृष्ठभूमि करते हैं, तो पृष्ठभूमि प्रक्रिया की $! पिड वास्तव में एक नई प्रक्रिया समूह आईडी संख्या (पीजीआईडी) है।

किसी स्क्रिप्ट में कोई नौकरी नियंत्रण सक्षम नहीं है, हालांकि, यह मामला नहीं हो सकता है! पृष्ठभूमि की प्रक्रिया का पिड एक नया पिगिड नहीं हो सकता है लेकिन एक सामान्य पिड! और यह है, त्रुटि संदेश -bash: kill: (-123) - No such process का कारण बनता है, एक प्रक्रिया समूह को मारने की कोशिश कर रहा है, लेकिन केवल kill कमांड पर एक सामान्य पिड (एक पीजीआईडी ​​के बजाय) निर्दिष्ट करना।

# the following code works in Terminal.app because $! == $pgid 
{ 
sleep 100 & 
IFS=" " read -r pgid <<EOF 
$(ps -p $! -o pgid=) 
EOF 
echo $$ $! $pgid 
sleep 10 
kill -HUP -- -$! 
#kill -HUP -- -${pgid} # use in script 
} 
+0

यह एक ** पूरी तरह से अलग ** प्रश्न – ndemou

+0

उत्तर देता है लेकिन वास्तव में मेरी समस्या समझाया :) – astrojuanlu

2
pkill -TERM -P <ProcessID> 

यह आम तौर पर मारे गए माता-पिता भी बच्चे को मारता है दोनों जनक के साथ-साथ बच्चे

5

मार डालेगा।

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

पीपीआईडी ​​# 1 क्यों है? माता-पिता की मृत्यु हो गई है और अब प्रक्रिया तालिका में नहीं है। child.sh से जुड़ा हुआ नहीं है। यह बस कोई चल रहा माता पिता नहीं है।यह कहकर कि इनिट से जुड़ा हुआ है यह इंप्रेशन बनाता है कि अगर हम किसी भी तरह से इनिट छोड़ देते हैं, तो इस प्रक्रिया को बंद करने पर नियंत्रण में नियंत्रण होता है। यह इस धारणा को भी बनाता है कि माता-पिता को मारने से दादाजी को बच्चे के मालिक बन जाएंगे। दोनों सच नहीं हैं। वह बाल प्रक्रिया अभी भी प्रक्रिया तालिका में मौजूद है और चल रही है, लेकिन इसकी प्रक्रिया आईडी के आधार पर कोई भी नई घटना तब तक संभाली नहीं जाएगी जब तक कि सिग्कील को संभाला न जाए। जिसका मतलब है कि बच्चा लेबल होने के खतरे में, मृत चलने वाला एक पूर्व-ज़ोंबी है। प्रक्रिया समूह में

हत्या अलग है, और भाई बहन को मारने के लिए प्रयोग किया जाता है, और इस प्रक्रिया को समूह # माता पिता। यह भी ध्यान रखना महत्वपूर्ण है कि "प्रक्रिया को मारना" मानव तरीके से प्रति "हत्या" नहीं है, जहां आप प्रक्रिया को नष्ट करने की उम्मीद करते हैं और सभी स्मृति वापस लौटती हैं जैसे कि यह कभी नहीं थी। यह सिर्फ इसे संभालने की प्रक्रिया के लिए, कई लोगों के बीच एक विशेष घटना भेजता है। यदि प्रक्रिया इसे ठीक से संभाल नहीं पाती है, तो थोड़ी देर बाद ओएस साथ आएगा और जबरन इसे "साफ कर देगा"।

यह (हत्या) तुरंत नहीं होता है क्योंकि बच्चे (या यहां तक ​​कि अभिभावक) डिस्क पर कुछ लिख सकता था और I/O के लिए इंतजार कर रहा था या कुछ अन्य महत्वपूर्ण कार्य करने के लिए इंतजार कर रहा था जो सिस्टम स्थिरता या समझौता कर सकता है फ़ाइल अखंडता।

+0

बेराका, ऐसा प्रतीत होता है कि आपने बस अपना पूरा जवाब दूषित कर दिया है। स्वीकृत उत्तर सही है, और मैं आपको इस लिंक के साथ छोड़ देता हूं: http://man7.org/linux/man-pages/man7/signal.7.html और उद्धरण "सिग्नल सिग्कील और सिगस्टॉप को सिग्नल, अवरुद्ध या अनदेखा नहीं किया जा सकता । " – ALL

+0

फिर से गलत। सब, स्पष्ट रूप से आप नहीं जानते कि उद्धरण का क्या अर्थ है। मैं आपको प्रबुद्ध कर दूंगा, क्योंकि आप स्पष्ट रूप से लिनक्स मैन पेज पढ़ते हैं, हालांकि लिनक्स यूनिक्स सिग्नलिंग की उत्पत्ति है। प्रक्रिया सिगिल और सिगस्टॉप के साथ कुछ भी करने के लिए विकल्प नहीं मिलती है। प्रक्रिया अभी भी लटक रही है क्योंकि केरनेल वर्तमान में प्रक्रिया की तरफ से I/O या अन्य कोर ड्राइवर कोड को संभालने में कामयाब रहा है। वह कोड वापस नहीं आया है और प्रक्रिया अवरुद्ध है। यह एक रन राज्य में नहीं है। इसमें उन घटनाओं के साथ कुछ भी करने का विकल्प नहीं है। सुसमाचार की तरह मनुष्यों के पृष्ठों को न सिर्फ आगे बढ़ाएं। – Beracah

संबंधित मुद्दे