स्टार्ट-स्टॉप-डेमॉन और रनिंग के बीच क्या अंतर है?


18

मैं /etc/init.d में एक सेवा स्थापित कर रहा हूं। मैं वहां विभिन्न लिपियों को देख रहा हूं, कुछ को लागू किया गया है start-stop-daemon ...और कुछ के साथ /path/to/script &

सभी एक फाइल में पिड को सेव करते हैं और कुछ चेक करते हैं।

सबसे अच्छा अभ्यास क्या है, अंतर क्या हैं, यहां जानना महत्वपूर्ण है ...? (सामान्य रूप में)

मेरे विशेष मामले में मेरे पास जावा में एक सरल लाइटवेट लोकलहोस्ट http सर्वर है जो कि हर घंटे या एक बार एक एप्लिकेशन कॉल करेगा और यह सिर्फ एक बेवकूफ रैंडम नंबर देता है (यहाँ और कोई विवरण नहीं है, मेरा सिर्फ यह मतलब है कि यह फाइल सिस्टम का उपयोग नहीं करता है या मेरे सवाल में इस मामले में धागे या कुछ भी जटिल है)

धन्यवाद

जवाबों:


27

एक बैकग्राउंड-जॉब (यानी के साथ शुरू किया गया) अभी भी है, यह टर्मिनल के साथ जुड़ा हुआ स्टड, स्टडआउट और स्टेडर है। इसे शुरू किया गया था। यह अचानक टर्मिनल को लिख सकता है। अग्रभूमि) या कीबोर्ड से इनपुट की प्रतीक्षा में (आपको पहले इसे अग्रभूमि में रखना होगा)। आप बैकग्राउंड-जॉब को टर्मिनल पर लिखने से रोकने के लिए किसी फ़ाइल या / dev / null में रीडायरेक्ट स्टडआउट और कोर्स कर सकते हैं।

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

एक डेमन - जैसे कि init.d द्वारा स्वचालित रूप से शुरू किया गया, लेकिन जिसे मैन्युअल रूप से टर्मिनल से भी शुरू किया जा सकता है - दूसरी तरफ, किसी भी टर्मिनलों से डिस्कनेक्ट हो जाता है। यहां तक ​​कि अगर यह मैन्युअल रूप से टर्मिनल से शुरू किया गया था, तो एक डेमॉन टर्मिनल से डिस्कनेक्ट हो जाएगा, इसलिए यह न तो लिख सकता है (स्टडआउट, स्टडर) और न ही इसे (स्टडिन) पढ़ सकता है। यह टर्मिनल द्वारा "स्वचालित रूप से" भेजे गए संकेतों के लिए "प्रतिरक्षा" भी है। (यद्यपि आप इसका उपयोग करके संकेत भेज सकते हैं kill -signal pid)।

"पृष्ठभूमि" और "अग्रभूमि" कुछ टर्मिनल के लिए प्रक्रिया की स्थिति को संदर्भित करता है - यह वर्तमान में टर्मिनल को नियंत्रित करने या नहीं करने वाली प्रक्रिया है। चूंकि डेमॉन एक टर्मिनल से जुड़े नहीं हैं (लेकिन इसे हर तरह से इसे काट दिया गया है), इसे बैकग्राउंड में चलाने के लिए नहीं कहा जा सकता है। डेमॉन केवल एक टर्मिनल के साथ जुड़े बिना चल रही प्रक्रिया है - न तो सामने या पृष्ठभूमि में।

यदि आप psउन विकल्पों के साथ उपयोग करते हैं जो दिखाते हैं कि कौन सी टर्मिनल एक प्रक्रिया का उपयोग करती है, तो आप देखेंगे कि फ्रंट और बैकग्राउंड दोनों ही टर्मिनल के साथ assosciated हैं (जैसे। tty2)। दूसरी ओर डेमन, एक "है?" इस क्षेत्र में।

डेमन आमतौर पर इस तरह से मुस्कराते हैं, भले ही वे मैन्युअल रूप से शुरू किए गए हों। खुद का डेमॉन बनाना, काफी काम की चीज है - टर्मिनल से पूरी तरह से अलग करने के लिए इसमें कुछ चालबाजी शामिल हैं। आपको इसे चलाने के लिए अपना उपयोगकर्ता / समूह बनाना चाहिए। यदि आप फ़ाइलों को बनाना चाहते हैं, तो आपको आमतौर पर / tmp, / var / tmp या / var / run का उपयोग करना चाहिए - इसके लिए आमतौर पर अन्य अधिकार नहीं होने चाहिए। चूंकि यह किसी टर्मिनल पर त्रुटियों की रिपोर्ट नहीं कर सकता है, इसलिए आपके पास इसे लॉग-फाइल (जैसे यह स्वयं लॉग / इन / वेरिएबल है) में लिखना चाहिए। डेमॉन को / पीआईआर में एक प्रविष्टि करनी चाहिए और इसके साथ वर्तमान पीआईडी ​​को चलाना चाहिए, और यह जांचना चाहिए कि क्या इसका दूसरा उदाहरण पहले से चल रहा था। यह जहां लागू हो वहां फाइलों या उपकरणों के लिए ताले (/ var / लॉक) का सम्मान करना चाहिए। इसे कॉन्फ़िगर-फ़ाइलों को फिर से लोड करके और अद्यतित कॉन्फ़िगरेशन का उपयोग करके SIGHUP को जवाब देना चाहिए।

एक और बिंदु यह है कि अधिकांश डेमॉन कैसे काम करते हैं। एक डेमन आमतौर पर एक एकल निष्पादन योग्य है जो दो अलग-अलग मोडों में से एक में चल सकता है; इस बात पर निर्भर करता है कि यह मूल डेमन है - अभिभावक - बूट पर या मैन्युअल रूप से शुरू किया गया ... या इस माता-पिता द्वारा पैदा किया गया बच्चा। मूल प्रक्रिया आमतौर पर बस बैठती है और किसी घटना का इंतजार करती है - एक विशिष्ट समय, समय बीतने, एक विशिष्ट नेटवर्क पोर्ट से जुड़ने का प्रयास, या कभी भी। जब ऐसा होता है, तो माता-पिता स्वयं के समान एक बाल-प्रक्रिया बनाते हैं (कांटा (सिस्टम-कॉल) का उपयोग करके) - और तुरंत एक और घटना (और शायद अधिक बच्चों को पैदा करना) की प्रतीक्षा में वापस चला जाता है। यह बाल-प्रक्रिया है जो वास्तव में काम करेगी - जैसे डिस्क को सिंक करना, कमांड चलाना (जैसे cron) या नेटवर्क-कनेक्शन स्थापित करना ( sshdया)ftpd)। माता-पिता और बच्चे के बीच एकमात्र अंतर यह है कि उन्हें अलग-अलग पीआईडी ​​मिला है और बच्चे का पीपीआईडी ​​(पेरेंट-पीआईडी) पेरेंट-प्रोसेस की पीआईडी ​​है - इसका उपयोग यह पता लगाने के लिए किया जा सकता है कि क्या प्रक्रिया माता-पिता या बच्चे की है। तो एक ही प्रक्रिया को दो तरीकों से संचालित करने में सक्षम होना चाहिए - प्रतीक्षा (और स्पॉनिंग) माता-पिता के रूप में, या एक कामकाजी बच्चे के रूप में।

हालांकि डेमॉन को लिखना मुश्किल नहीं है, यह या तो तुच्छ नहीं है - जैसा कि आप देखते हैं कि कुछ "ट्रिक्स" हैं जो आपको पहले पता होनी चाहिए। सामान्य तौर पर, मुझे लगता है कि अन्य विकल्पों की तुलना में डेमन लिखने के लिए बहुत कम लाभ के लिए बहुत प्रयास करने की आवश्यकता होगी:

पृष्ठभूमि-नौकरी का उपयोग करना nohupया disownआमतौर पर एक अच्छा पर्याप्त विकल्प है, क्योंकि यह प्रक्रिया को जीवित रखता है भले ही टर्मिनल बंद हो। हालांकि यह अक्सर एक फ़ाइल या / dev / null को stdout और stderr को पुनर्निर्देशित करने का एक अच्छा विचार है। अधिक इंटरैक्टिव कार्यक्रमों के लिए, screenकुछ "दूर" डालने का एक अच्छा तरीका है जब तक आपको इसकी आवश्यकता न हो। at, batchऔर crontabकंसडर के लायक भी है।


1
इसके अलावा मैं अपने पुराने यूनिक्स सिस्टम पाठ्यक्रमों से याद करता हूं, कि जब टर्मिनल से लॉन्च किया जाता है तो सर्वर को अपना [प्रोसेस ग्रुप] [ en.wikipedia.org/wiki/Process_group] भी छोड़ना होगा । जहां तक ​​मुझे याद है। ताकि प्रक्रिया अपने मूल टर्मिनल से किसी भी संकेत को प्रतिरक्षा कर सके।
ब्यूम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.