नई मूल प्रक्रिया जब मूल प्रक्रिया मर जाती है


22

UNIX में, जब एक मूल प्रक्रिया गायब हो जाती है, तो मैंने सोचा कि सभी बच्चे प्रक्रियाएं अपने माता-पिता के रूप में init को रीसेट करती हैं। क्या यह हर समय सही नहीं है? क्या कोई अपवाद हैं?

जवाबों:


5

मेरी टिप्पणी को एक उत्तर में ले जाना .... मुझे विश्वास नहीं है कि अपवाद हैं।

यह पाया गया "कभी-कभी माता-पिता की प्रक्रिया को उसके बच्चे को मारने से पहले ही मार दिया जाता है। इस मामले में," सभी प्रक्रियाओं के जनक, " initप्रक्रिया, नई PPID (मूल प्रक्रिया ID) बन जाती है। कुछ समय में इन प्रक्रियाओं को अनाथ प्रक्रिया कहा जाता है।" स्रोत

इसी तरह आईबीएम के ब्लॉग में वर्णित है : "माता-पिता की मृत्यु हो जाती है या बच्चे की मृत्यु हो जाती है। उपरोक्त परिदृश्य में, बच्चे की प्रक्रिया अनाथ प्रक्रिया बन जाती है (जैसा कि उसने अपने माता-पिता को खो दिया है)। लिनक्स में, initप्रक्रिया बचाव के लिए आती है। अनाथ प्रक्रिया करता है और उन्हें गोद लेता है। इसका मतलब है कि एक बच्चे ने अपने माता-पिता को खो दिया है, यह initप्रक्रिया उसकी नई मूल प्रक्रिया बन गई है। "


61

2014 में लिखे गए तीन उत्तर, सभी यह कहते हुए कि यूनिक्स और लिनक्स में बिना किसी अपवाद के # 1 को संसाधित करने के लिए पुन: प्रस्तुत किया गया है। तीन गलत जवाब। ☺

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

इन तीन उत्तरों के दो साल पहले लिखे गए थे, और तीन साल पहले तक तेजी से आने वाले इस उत्तर को लिखने के बाद, लिनक्स कर्नेल बदल गया। सिस्टमड डेवलपर्स ने खुद को "सबरीपर्स" के रूप में स्थापित करने के लिए प्रक्रियाओं की क्षमता को जोड़ा। लिनक्स 3.4 से आगे की प्रक्रियाएं विकल्प के prctl()साथ सिस्टम कॉल जारी कर सकती हैं PR_SET_CHILD_SUBREAPER, और परिणामस्वरूप, वे # 1 प्रक्रिया नहीं करते हैं, उनके अनाथ वंशजों में से किसी के माता-पिता बन जाएंगे। के लिए आदमी पेजprctl() अप-टू-डेट है, लेकिन अन्य आदमी पृष्ठों तारीख तक लाया नहीं किया गया है और लगातार बना दिया।

संस्करण 10.2 में, FreeBSD ने एक ही क्षमता प्राप्त की, अपने मौजूदा procctl()सिस्टम कॉल को PROC_REAP_ACQUIREऔर PROC_REAP_RELEASEविकल्पों के साथ विस्तारित किया । इस तंत्र को ड्रैगनफली बीएसडी से अपनाया गया; जो इसे 4.2 संस्करण में प्राप्त हुआ, मूल रूप से नाम reapctl()दिया गया लेकिन नाम बदलकर विकास के दौरान procctl()

इसलिए अपवाद हैं, और काफी प्रमुख हैं: लिनक्स पर, FreeBSD / PC-BSD, और DragonFly BSD में, अनाथ बच्चों की मूल प्रक्रिया उस बच्चे की निकटतम पूर्वजों की प्रक्रिया में सेट की जाती है जिसे एक उप-सहायक या प्रक्रिया # 1 के रूप में चिह्नित किया जाता है। यदि कोई पूर्वज उप-प्रक्रिया नहीं है। विभिन्न डेमॉन पर्यवेक्षण उपयोगिताओं - सिस्टमड सहित (जिनके डेवलपर्स ने इसे लिनक्स कर्नेल में पहले स्थान पर रखा है), अपस्टार्ट, और नोश service-manager- पहले से ही इसका उपयोग करते हैं।

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

आगे की पढाई


मैंने वास्तव में अनाथ प्रक्रियाओं को एक सत्र इनिट (उबंटू के साथ अपस्टार्ट पर) संलग्न करने के लिए देखा था, लेकिन इसके महत्व को कभी महसूस नहीं किया। +1
मुरु

विशेष रूप से अपस्टार्ट सत्र init पर अधिक के लिए unix.stackexchange.com/a/194208/5132 देखें ।
JdeBP

8

exitएकल UNIX® विशिष्टता से मैन पेज के अनुसार , संस्करण 2:

कॉलिंग प्रक्रिया के सभी मौजूदा प्रक्रियाओं और ज़ोंबी प्रक्रियाओं की मूल प्रक्रिया आईडी कार्यान्वयन-निर्भर प्रणाली प्रक्रिया की प्रक्रिया आईडी के लिए सेट है। यही है, इन प्रक्रियाओं को एक विशेष सिस्टम प्रक्रिया द्वारा विरासत में मिला है।

अधिकांश यूनिक्स वेरिएंट के लिए, वह विशेष प्रक्रिया है init(PID 1)।

लिनक्स wait(2)मैन पेज इसकी पुष्टि करता है:

यदि एक माता-पिता की प्रक्रिया समाप्त हो जाती है, तो उसके "ज़ोंबी" बच्चों (यदि कोई हो) को init (8) द्वारा अपनाया जाता है, जो स्वचालित रूप से लाश को निकालने के लिए प्रतीक्षा करता है।

FreeBSD wait(2), NetBSD wait(2), OpenBSD wait(2)और Mac OS X wait(2)मैन पेज इसकी पुष्टि करते हैं:

यदि कोई माता-पिता प्रक्रिया अपने सभी बच्चे की प्रक्रिया समाप्त होने की प्रतीक्षा किए बिना समाप्त हो जाती है, तो शेष बच्चे प्रक्रियाओं को मूल प्रक्रिया 1 ID (init प्रक्रिया आईडी) सौंपी जाती है।

Oracle Solaris 11.1 wait(3C)मैन पेज इसकी पुष्टि करता है:

यदि कोई अभिभावक प्रक्रिया अपने बच्चे की प्रक्रियाओं को समाप्त करने के लिए प्रतीक्षा किए बिना समाप्त हो जाती है, तो प्रत्येक बच्चे की प्रक्रिया की मूल प्रक्रिया आईडी 1 पर सेट की जाती है, जिसमें प्रारंभिक प्रक्रिया बच्चे की प्रक्रियाओं को विरासत में मिलती है; देखते हैं Intro(2)


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