प्रॉम्ट और दायरा
प्रोसेस के समाप्त होने के बाद न्यूमेरिक PIDs का पुनः उपयोग किया जा सकता है, इसलिए विलंबित सिग्नल या स्थिति जांच गलत प्रोसेस को लक्षित कर सकती है। Linux किसी प्रोसेस को संदर्भित करने वाले फ़ाइल डिस्क्रिप्टर के लिए pidfd_open() और उस प्रोसेस को सिग्नल भेजने के लिए pidfd_send_signal() प्रदान करता है। मुख्य कौशल सिस्टम प्रोग्रामिंग और जीवनचक्र की शुद्धता है, इसलिए यह एक coding प्रश्न है।
साक्षात्कारकर्ता क्या मूल्यांकन करते हैं
मजबूत उत्तर डिस्क्रिप्टर पहचान, poll या epoll तत्परता (readiness), waitid एकीकरण, close-on-exec, अनुमतियाँ (permissions), और क्लीनअप की व्याख्या करते हैं। वे pidfd को असीमित पहुँच प्रदान करने वाले प्रोसेस हैंडल से अलग करते हैं, fork/exec रेस को संभालते हैं, और निकास (exit), पुनरारंभ (restart), टाइमआउट, और सुपरवाइज़र क्रैश के लिए व्यवहार को परिभाषित करते हैं। वे कर्नेल-संस्करण सुविधा पहचान और एक परीक्षित फ़ॉलबैक का भी उल्लेख करते हैं।
पहले स्पष्ट करने योग्य प्रश्न
- सुपरवाइज़र को किन कर्नेल संस्करणों और नेमस्पेस का समर्थन करना चाहिए?
- क्या यह चाइल्ड प्रोसेस स्वयं लॉन्च करता है, या मौजूदा प्रोसेस से जुड़ता है?
- क्या इसे निकास स्थिति (exit status) का निरीक्षण करना चाहिए, सिग्नल भेजना चाहिए, या दोनों?
- क्या वर्कर वंशज (descendants) को fork कर सकता है, और उनके क्लीनअप का स्वामी कौन है?
- टाइमआउट, पुनरारंभ, और सुपरवाइज़र-क्रैश की गारंटी क्या हैं?
- क्या pidfd समर्थन के बिना कर्नेल पर फ़ॉलबैक आवश्यक है?
30-सेकंड उत्तर ढांचा
"मैं प्रत्येक प्रबंधित प्रोसेस के लिए एक pidfd प्राप्त करूँगा और केवल उसके न्यूमेरिक PID को ही नहीं, बल्कि डिस्क्रिप्टर को भी संग्रहीत करूँगा। डिस्क्रिप्टर को poll या epoll में जोड़ें, स्थिति एकत्र करने के लिए दस्तावेजीकृत wait ऑपरेशन का उपयोग करें, और टाइमआउट या शटडाउन के लिए pidfd_send_signal() को कॉल करें। close-on-exec सेट करें, प्रत्येक टर्मिनल पथ पर डिस्क्रिप्टर बंद करें, और तत्परता एवं स्थिति संग्रह को एक जीवनचक्र स्टेट मशीन के रूप में मानें। मैं PID पुनः उपयोग, त्वरित निकास, अनुमति त्रुटियों, fork किए गए चाइल्ड प्रोसेस, कर्नेल सुविधा पहचान, और सुपरवाइज़र पुनरारंभ का परीक्षण करूँगा।"
चरण-दर-चरण उत्तर
चरण 1: डिस्क्रिप्टर प्राप्त करना और उसका स्वामित्व रखना
किसी प्रोसेस को लॉन्च करने या उसका पता लगाने के बाद, जहाँ समर्थित हो वहाँ pidfd_open() को कॉल करें और डिस्क्रिप्टर को एक ओनर टेबल में रिकॉर्ड करें। इसे close-on-exec के रूप में चिह्नित करें और न्यूमेरिक PID को केवल लॉग के लिए रखें। स्पष्ट स्वामित्व हस्तांतरण के बिना असंबद्ध वर्कर्स को डिस्क्रिप्टर पास न करें।
चरण 2: जीवनचक्र इवेंट्स का निरीक्षण करना
pidfds को poll या epoll के साथ पंजीकृत करें। तत्परता इंगित करती है कि संदर्भित प्रोसेस समाप्त हो गई है; उपयुक्त wait ऑपरेशन के साथ इसकी स्थिति एकत्र करें और फिर डिस्क्रिप्टर को बंद करें। किसी पुराने /proc पथ या PID पूर्णांक से जीवंतता का अनुमान न लगाएँ।
चरण 3: सही प्रोसेस को सिग्नल भेजना
सुचारू समाप्ति (graceful termination) और वृद्धि (escalation) के लिए pidfd_send_signal() का उपयोग करें। अनुमति और नेमस्पेस त्रुटियों को स्पष्ट रूप से संभालें। एक pidfd संदर्भित प्रोसेस की पहचान करता है भले ही उसका न्यूमेरिक PID बाद में पुनः उपयोग किया गया हो, लेकिन यह प्राधिकरण जांच (authorization checks) की जगह नहीं लेता है।
चरण 4: पुनरारंभ और वंशजों का मॉडल तैयार करना
प्रत्येक वर्कर को starting, running, stopping, exited, या failed के रूप में दर्शाएँ। पुनरारंभ पर, एक नया pidfd और जनरेशन रिकॉर्ड बनाएं। तय करें कि वंशज एक ही प्रोसेस समूह, cgroup, या अलग स्वामित्व डोमेन में हैं; कभी यह न मानें कि पैरेंट को सिग्नल देने से प्रत्येक चाइल्ड प्रोसेस साफ़ हो जाती है।
चरण 5: रेस और पोर्टेबिलिटी सीमाओं का परीक्षण करना
त्वरित निकास और PID पुनः उपयोग, निकास के साथ समवर्ती सिग्नल, डिस्क्रिप्टर समाप्त होना, सुपरवाइज़र क्रैश, नेमस्पेस परिवर्तन, और असमर्थित कर्नेल का स्ट्रेस टेस्ट करें। प्रत्यक्ष चाइल्ड प्रोसेस के लिए waitpid जैसे सावधानीपूर्वक सीमित फ़ॉलबैक के साथ तुलना करें, और रिकॉर्ड करें कि फ़ॉलबैक कौन सी गारंटी प्रदान नहीं कर सकता है।
मॉडल उत्तर
"त्रुटि प्रोसेस पहचान के रूप में एक पुन: प्रयोज्य पूर्णांक का उपयोग करने से आती है। मैं प्रति वर्कर एक pidfd संग्रहीत करूँगा, इसे एक इवेंट लूप के साथ पंजीकृत करूँगा, तत्परता के बाद निकास स्थिति एकत्र करूँगा, और सुचारू स्टॉप और एस्केलेशन के लिए pidfd_send_signal() के माध्यम से सिग्नल दूँगा। डिस्क्रिप्टर स्वामित्व, close-on-exec, अनुमतियाँ, और वंशज क्लीनअप स्पष्ट स्टेट-मशीन नियम बन जाते हैं। प्रत्येक पुनरारंभ को एक नई पीढ़ी और pidfd मिलता है। परीक्षणों को त्वरित निकास और PID पुनः उपयोग को बाध्य करना चाहिए, नेमस्पेस और कर्नेल समर्थन को कवर करना चाहिए, और प्रत्यक्ष-चाइल्ड फ़ॉलबैक की कमजोर गारंटियों का दस्तावेजीकरण करना चाहिए।"
सामान्य गलतियाँ
- केवल न्यूमेरिक PID रखना → विलंबित सिग्नल PID पुनः उपयोग के साथ रेस करते हैं → pidfd बनाए रखें।
- जीवंतता के लिए
/procको पोल करना → अवलोकन पुराने हो जाते हैं → pidfd तत्परता और स्थिति संग्रह का उपयोग करें। - यह मानना कि pidfd अनुमतियों को बायपास करता है → सिग्नलों को अभी भी प्राधिकरण की आवश्यकता होती है → अनुमति त्रुटियों को संभालें।
- exec के दौरान डिस्क्रिप्टर लीक करना → असंबद्ध प्रोग्राम जीवनचक्र हैंडल इनहेरिट करते हैं → close-on-exec सेट करें।
- केवल पैरेंट को समाप्त करना → वंशज अनाथ रह जाते हैं → समूह या cgroup स्वामित्व परिभाषित करें।
- तत्परता को पूर्ण स्थिति मानना → निकास कोड प्रबंधन अधूरा रहता है → wait स्थिति एकत्र करें और सुरक्षित रखें।
अनुवर्ती प्रश्न
अनुवर्ती 1: क्या pidfd PID के पुनः उपयोग को रोकता है?
यह pidfds स्वीकार करने वाले ऑपरेशनों के लिए प्रोसेस को एक स्थिर डिस्क्रिप्टर संदर्भ प्रदान करता है। न्यूमेरिक PID का पुनः उपयोग किया जा सकता है, लेकिन डिस्क्रिप्टर के माध्यम से किए गए ऑपरेशन अभी भी मूल प्रोसेस को संदर्भित करते हैं।
अनुवर्ती 2: क्या आप epoll के साथ pidfds का उपयोग कर सकते हैं?
हाँ, प्रोसेस निकास के लिए pidfd को पोल किया जा सकता है, इसलिए यह पाइप, टाइमर और कंट्रोल सॉकेट्स के साथ सुपरवाइज़र के इवेंट लूप में भाग ले सकता है।
अनुवर्ती 3: यदि कर्नेल में pidfd समर्थन का अभाव हो तो क्या होगा?
स्टार्टअप पर क्षमता का पता लगाएँ और प्रत्यक्ष चाइल्ड प्रोसेस के लिए एक दस्तावेजीकृत फ़ॉलबैक का उपयोग करें, जबकि समकक्ष होने का नाटक करने के बजाय कमजोर रेस और अवलोकनीयता गारंटियों को उजागर करें।
अनुवर्ती 4: सुपरवाइज़र के पुनरारंभ होने के बाद क्या होता है?
वर्कर्स को फिर से खोजने या जानबूझकर छोड़ने के लिए पर्याप्त स्वामित्व मेटाडेटा को बनाए रखें, फिर निगरानी स्थिति और pidfds को फिर से बनाएं। कभी भी केवल सहेजे गए न्यूमेरिक PID पर भरोसा न करें।