दूसरा उत्तर स्पष्ट और तकनीकी रूप से सही है (और इसलिए मैंने तदनुसार ऊपर उठाया)।
एक और जवाब है: "नहीं, कोड लिखना न करें जो खुद को डिमन करता है।"
बजाय एक प्रक्रिया पर्यवेक्षण फ्रेमवर्क (daemontools या runit या launchd) की तरह है कि आप के लिए यह का ख्याल रखता है का उपयोग करें।
पारंपरिक यूनिक्स सर्वर स्वयं daemonizing है, और कई बातों पर इस तरह के fusses के रूप में: आदि वर्तमान कार्यशील निर्देशिका, प्रक्रिया समूह और सत्र स्वतंत्रता, संकेत मास्क और स्वभाव, फाइल सिस्टम जड़, विशेषाधिकार, umask, खुले फ़ाइल वर्णनकर्ता,
हालांकि, इनमें से अधिकांश या सभी प्रक्रिया विशेषताओं को exec()
में विरासत में मिला है, जिसका अर्थ है कि एक सर्वर प्रक्रिया आमतौर पर वांछित प्रक्रिया समूह, कार्यशील निर्देशिका, रूट इत्यादि के साथ "पैदा" हो सकती है। अपने आप को सब कुछ करने की आवश्यकता नहीं है , हालांकि आपको अक्सर विशेषाधिकार प्राप्त संचालन और विशेषाधिकार निरस्त करने का प्रबंधन करना होगा।
(दरअसल, मैं तर्क दूंगा कि आत्म-डिमनीकरण कार्यक्रमों को लिखने में दीर्घकालिक जोखिम है। बॉयलरप्लेट "पृष्ठभूमि" दिनचर्या प्रतिलिपि बनाई जाती है और पेस्ट की जाती है और जल्दी से पोर्ट और विस्तारित होती है, और प्रोग्रामर सहायक कोड पर समय बिताता है कार्यक्रम का मुख्य उद्देश्य।)
मुझे लगता है कि कारण का एक हिस्सा यह है कि एक डेमॉन को आउटपुट लिखने या इनपुट पढ़ने की उम्मीद नहीं है। अगर आप शुरू करना चाहते थे, उदा। एक एसएसएच सत्र पर एक HTTP सर्वर, आप बाद में सत्र में यादृच्छिक चेतावनी आउटपुट की उम्मीद नहीं करेंगे। –
@ जॉन चडविक आप जो कह रहे हैं वह वास्तव में उन चीजों में से एक है जो आप डिमन में परिवर्तित करते समय करना चाहते हैं, लेकिन आप इसे स्टडीन, स्टडआउट और स्टडरर बंद करके प्राप्त करते हैं। कुछ सिग्नल से बचने के लिए आप टर्मिनल से अलग हो जाते हैं (नीचे दिए गए उत्तरों देखें)। –
क्या आप मेरे उत्तर को "अस्वीकार" कर सकते हैं और इसके बजाय @ AdamZalcman को स्वीकार कर सकते हैं? वह मुझसे ज्यादा बेहतर काम करता है। और वह setid() के बारे में पूरी तरह से सही है, आपको इसका उपयोग करना चाहिए। – fge