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

यहां बताया गया है कि आप लिनक्स मशीन पर डेमॉन कैसे बना सकते हैं।

डेमॉन कैसे बनाए जाते हैं इसका एक संक्षिप्त परिचय

सिस्टम पर बहुत सारे डेमॉन चलते हैं और कुछ परिचित डेमॉन उदाहरण इस प्रकार हैं:

  • क्रोनडो: निर्दिष्ट समय पर कमांड चलाता है
  • एसएसएचडी: दूरस्थ मशीनों से सिस्टम में लॉगिन की अनुमति देता है
  • httpd: वेब पेज परोसता है
  • एनएफएसडी: नेटवर्क पर फ़ाइल साझा करने की अनुमति देता है

इसके अलावा, डेमॉन प्रक्रियाओं को आमतौर पर अक्षर के साथ समाप्त करने के लिए नामित किया जाता है डी, हालांकि यह अनिवार्य नहीं है।

एक प्रक्रिया को डेमॉन के रूप में चलाने के लिए, निम्न पथ का अनुसरण किया जाता है:

  • प्रारंभिक संचालन, जैसे कि कॉन्फ़िगरेशन फ़ाइलों को पढ़ना या आवश्यक सिस्टम संसाधन प्राप्त करना, प्रक्रिया के डेमॉन बनने से पहले किया जाना चाहिए। इस तरह, सिस्टम उपयोगकर्ता को प्राप्त त्रुटियों की रिपोर्ट कर सकता है और प्रक्रिया को एक उपयुक्त त्रुटि कोड के साथ समाप्त कर दिया जाएगा।
    instagram viewer
  • एक पृष्ठभूमि चलने की प्रक्रिया init के साथ इसकी मूल प्रक्रिया के रूप में बनाई जाती है। इस प्रयोजन के लिए, पहले init प्रक्रिया से एक उप-प्रक्रिया को फोर्क किया जाता है, और फिर ऊपरी प्रक्रिया को बाहर निकलने के साथ समाप्त किया जाता है।
  • सेटसिड फ़ंक्शन को कॉल करके एक नया सत्र खोलना चाहिए, और प्रक्रिया को टर्मिनल से डिस्कनेक्ट कर दिया जाना चाहिए।
  • पैरेंट प्रोसेस से इनहेरिट की गई सभी ओपन फाइल डिस्क्रिप्टर बंद हैं।
  • मानक इनपुट, आउटपुट, और त्रुटि संदेशों को पुनर्निर्देशित किया जाता है /dev/null.
  • प्रक्रिया की कार्यशील निर्देशिका को बदलना होगा।

डेमॉन सत्र क्या हैं?

टर्मिनल के माध्यम से सिस्टम में लॉग इन करने के बाद, उपयोगकर्ता शेल प्रोग्राम के माध्यम से कई एप्लिकेशन चला सकते हैं। जब उपयोगकर्ता सिस्टम से बाहर निकलता है तो इन प्रक्रियाओं को बंद कर देना चाहिए। ऑपरेटिंग सिस्टम इन प्रक्रियाओं को सत्र और प्रक्रिया समूहों में समूहित करता है।

प्रत्येक सत्र में प्रक्रिया समूह होते हैं। आप इस स्थिति का वर्णन इस प्रकार कर सकते हैं:

वह टर्मिनल जहाँ प्रक्रियाएँ अपना इनपुट प्राप्त करती हैं और अपना आउटपुट भेजती हैं, कंट्रोलिंग टर्मिनल कहलाता है। एक नियंत्रण टर्मिनल एक समय में केवल एक सत्र से जुड़ा होता है।

एक सत्र और उसमें प्रक्रिया समूहों की पहचान (आईडी) संख्याएं होती हैं; ये पहचान संख्या सत्र और प्रक्रिया समूह के नेताओं की प्रक्रिया पहचान संख्या (पीआईडी) हैं। चाइल्ड प्रोसेस उसी ग्रुप को शेयर करती है जो उसकी पैरेंट प्रोसेस है। जब कई प्रक्रियाएं होती हैं पाइप तंत्र के साथ संचार, पहली प्रक्रिया प्रक्रिया समूह नेता बन जाती है।

लिनक्स पर डेमॉन प्रोसेस बनाना

यहां आप देखेंगे कि आप डेमॉन फ़ंक्शन कैसे बना सकते हैं। इस उद्देश्य के लिए, आप नाम का एक फंक्शन बनाएंगे _डेमन. आप उस एप्लिकेशन कोड को नाम देकर शुरू कर सकते हैं जो एक डेमॉन के रूप में चलेगा टेस्ट.सी, और कोड जिसे आप डेमॉन फ़ंक्शन के रूप में बनाएंगे daemon.c.

//test.c
#शामिल करना <stdio.h>
पूर्णांक_डेमन(पूर्णांक, पूर्णांक);
पूर्णांकमुख्य()
{
गेटचर ();
_डेमन (0, 0);
गेटचर ();
वापसी0;
}
//daemon.c
#शामिल करना <sys/types.h>
#शामिल करना <sys/stat.h>
#शामिल करना <stdlib.h>
#शामिल करना <stdio.h>
#शामिल करना <fcntl.h>
#शामिल करना <unistd.h>
#शामिल करना <लिनक्स/fs.h>
#शामिल करना <linux/limits.h>
पूर्णांक_डेमन(पूर्णांक नोचदिर, पूर्णांक नोक्लोज़){
pid_t पिड;
पिड = कांटा (); // मूल प्रक्रिया को फोर्क करें
अगर (पीआईडी < 0) {
बाहर निकलना(EXIT_FAILURE);
}
अगर (पीआईडी > 0) {
बाहर निकलना(EXIT_SUCCESS);
}
वापसी0;
}

एक डेमॉन बनाने के लिए, आपको एक पृष्ठभूमि प्रक्रिया की आवश्यकता होती है जिसकी मूल प्रक्रिया init है। उपरोक्त कोड में, _डेमन एक बाल प्रक्रिया बनाता है और फिर मूल प्रक्रिया को मारता है। इस मामले में, आपकी नई प्रक्रिया init की एक उपप्रक्रिया होगी और पृष्ठभूमि में चलती रहेगी।

अब निम्न कमांड के साथ एप्लिकेशन को संकलित करें और पहले और बाद में प्रक्रिया की स्थिति की जांच करें _deamon कहा जाता है:

जीसीसी-ओपरीक्षणपरीक्षण।सीडेमॉन।सी

एप्लिकेशन चलाएँ और किसी अन्य कुंजी को दबाए बिना किसी भिन्न टर्मिनल पर स्विच करें:

./परीक्षण

आप देख सकते हैं कि आपकी प्रक्रिया से संबंधित मान इस प्रकार हैं। यहाँ, आपको उपयोग करना होगा प्रक्रिया से संबंधित जानकारी प्राप्त करने के लिए ps कमांड. इस मामले में, _डेमन समारोह अभी तक नहीं बुलाया गया है।

पीएस -सी परीक्षण -ओ "पिड पीपीआईडी ​​पीजीआईडी ​​​​सिड टीटीई" स्टेटआज्ञा"
# आउटपुट
पीआईडी ​​पीपीआईडी ​​पीजीआईडी ​​सिड टीटी स्टेट कमांड
10296 5119 10296 5117 अंक/2 एस+ ./परीक्षण

जब आप को देखते हैं स्टेट फ़ील्ड, आप देखते हैं कि आपकी प्रक्रिया चल रही है लेकिन एक ऑफ-शेड्यूल घटना होने की प्रतीक्षा कर रही है जिससे यह अग्रभूमि में चल सके।

संक्षेपाक्षर अर्थ
एस किसी घटना के घटित होने की प्रतीक्षा में
टी आवेदन रुक गया
एस सत्र नेता
+ आवेदन अग्रभूमि में चल रहा है

आप देख सकते हैं कि आपके आवेदन की मूल प्रक्रिया अपेक्षित शेल है।

पीएस -जेपी 5119 
# आउटपुट
पीआईडी ​​पीजीआईडी ​​सिड टीटीई टाइम सीएमडी
5119 5119 5117 अंक/2 00:00:02 zsh

अब उस टर्मिनल पर वापस आएं जहां आप अपना आवेदन चला रहे हैं और दबाएं दर्ज का आह्वान करना _डेमन समारोह। फिर दूसरे टर्मिनल पर प्रक्रिया की जानकारी को फिर से देखें।

पीएस -सी परीक्षण -ओ "पिड पीपीआईडी ​​पीजीआईडी ​​​​सिड टीटीई" स्टेटआज्ञा"
# आउटपुट
पीआईडी ​​पीपीआईडी ​​पीजीआईडी ​​सिड टीटी स्टेट कमांड
22504 1 22481 5117 अंक/2 एस ./परीक्षण

सबसे पहले, आप कह सकते हैं कि नया सबप्रोसेस बैकग्राउंड में चल रहा है क्योंकि आप नहीं देखते हैं + में चरित्र स्टेट खेत। अब जांच करें कि निम्न आदेश का उपयोग करके प्रक्रिया की मूल प्रक्रिया कौन है:

पीएस -जेपी 1 
​​​​​​​# आउटपुट
पीआईडी ​​पीजीआईडी ​​सिड टीटीई टाइम सीएमडी
1 1 1? 00:00:01सिस्टमडी

अब आप देख सकते हैं कि आपकी प्रक्रिया की मूल प्रक्रिया है सिस्टमडी प्रक्रिया। ऊपर उल्लेख किया गया है कि अगले चरण के लिए, एक नया सत्र खुल जाना चाहिए और प्रक्रिया को नियंत्रण टर्मिनल से डिस्कनेक्ट कर दिया जाना चाहिए। इसके लिए आप setsid function का इस्तेमाल करें। इस कॉल को अपने में जोड़ें _डेमन समारोह।

जोड़ने के लिए कोड का टुकड़ा इस प्रकार है:

अगर (सेटसिड () == -1) 
वापसी-1;

अब जब आपने पहले राज्य का निरीक्षण किया है _डेमन कहा जाता है, अब आप पहले को हटा सकते हैं गेटचार में समारोह टेस्ट.सी कोड।

//test.c
#शामिल करना <stdio.h>
पूर्णांक_डेमन(पूर्णांक, पूर्णांक);
पूर्णांकमुख्य()
{
_डेमन (0, 0);
गेटचर ();
वापसी0;
}

एप्लिकेशन को फिर से संकलित करने और चलाने के बाद, उस टर्मिनल पर जाएं जहां आपने अपनी समीक्षा की थी। आपकी प्रक्रिया की नई स्थिति इस प्रकार है:

पीएस -सी परीक्षण -ओ "पिड पीपीआईडी ​​पीजीआईडी ​​​​सिड टीटीई" स्टेटआज्ञा"
​​​​​​​# आउटपुट
पीआईडी ​​पीपीआईडी ​​पीजीआईडी ​​सिड टीटी स्टेट कमांड
25494 1 25494 25494? एस.एस./परीक्षण

? में साइन इन करें टीटी फ़ील्ड इंगित करता है कि आपकी प्रक्रिया अब किसी टर्मिनल से कनेक्ट नहीं है। ध्यान दें कि पीआईडी, पीजीआईडी, और सिड आपकी प्रक्रिया के मूल्य समान हैं। आपकी प्रक्रिया अब एक सत्र नेता है।

अगले चरण में, आपके द्वारा पारित तर्क के मूल्य के अनुसार कार्यशील निर्देशिका को रूट निर्देशिका में बदलें। आप निम्न स्निपेट को इसमें जोड़ सकते हैं _डेमन इसके लिए कार्य:

अगर (!nochdir) {
अगर (chdir("/") == -1)
वापसी-1;
}

अब, पारित तर्क के अनुसार, सभी फाइल डिस्क्रिप्टर बंद किए जा सकते हैं। निम्नलिखित कोड को इसमें जोड़ें _डेमन समारोह:

#परिभाषित करें NR_OPEN 1024
अगर (! नोक्लोज़) {
के लिए (i = 0; मैं < NR_OPEN; मैं++)
बंद (मैं);
खुला("/dev/व्यर्थ", ओ_आरडीडब्ल्यूआर);
डुप (0);
डुप (0);
}

सभी फाइल डिस्क्रिप्टर बंद होने के बाद, डेमॉन द्वारा खोली गई नई फाइलें क्रमशः 0, 1 और 2 डिस्क्रिप्टर के साथ दिखाई जाएंगी। इस मामले में, उदाहरण के लिए, printf कोड में कमांड को दूसरी ओपन की गई फाइल पर निर्देशित किया जाएगा। इससे बचने के लिए, पहले तीन पहचानकर्ता इंगित करते हैं /dev/null उपकरण।

इस मामले में, की अंतिम स्थिति _डेमन समारोह इस प्रकार होगा:

#शामिल करना <sys/types.h>
#शामिल करना <sys/stat.h>
#शामिल करना <stdio.h>
#शामिल करना <stdlib.h>
#शामिल करना <fcntl.h>
#शामिल करना <त्रुटिपूर्ण>
#शामिल करना <unistd.h>
#शामिल करना <syslog.h>
#शामिल करना <string.h>
पूर्णांक_डेमन(खालीपन){
// पीआईडी: प्रक्रिया आईडी
// एसआईडी: सत्र आईडी
pid_t पिड, सिड;
पिड = कांटा (); // मूल प्रक्रिया को फोर्क करें
अगर (पीआईडी < 0) {
बाहर निकलना(EXIT_FAILURE);
}
अगर (पीआईडी > 0) {
बाहर निकलना(EXIT_SUCCESS);
}
// सृजन करनासिडके लिएबच्चा
सिड = सेटसिड ();
अगर (सिडो < 0) {
// विफल
बाहर निकलना(EXIT_FAILURE);
}
अगर ((chdir("/")) < 0) {
// विफल
बाहर निकलना(EXIT_FAILURE);
}
बंद करें (STDIN_FILENO);
बंद करें (STDOUT_FILENO);
बंद करें (STDERR_FILENO);
जबकि (1) {
// कुछ कार्य
नींद (30);
}
बाहर निकलना(EXIT_SUCCESS);
}

यहां एक कोड स्निपेट का उदाहरण दिया गया है जो इसे चलाता है एसएसएचडी एक के रूप में आवेदन डेमॉन:

...
अगर (!(debug_flag || inetd_flag || no_daemon_flag)) {
पूर्णांक एफडी;
अगर (डेमन (0, 0) < 0)
घातक("डेमॉन () विफल: %.200s", स्ट्रेरर (गलती));
/* कंट्रोलिंग ट्टी से डिस्कनेक्ट करें। */
एफडी = खुला (_PATH_TTY, O_RDWR | O_NOCTTY);
अगर (एफडी >= 0) {
(खालीपन) ioctl (fd, TIOCNOTTY, NULL);
बंद (एफडी);
}
}
...

लिनक्स सिस्टम प्रोग्रामिंग के लिए डेमॉन महत्वपूर्ण हैं

डेमॉन ऐसे प्रोग्राम हैं जो कुछ घटनाओं के जवाब में निर्धारित पूर्वनिर्धारित तरीके से विभिन्न क्रियाएं करते हैं। वे आपकी Linux मशीन पर चुपचाप चलते हैं. वे उपयोगकर्ता के सीधे नियंत्रण में नहीं होते हैं और पृष्ठभूमि में चलने वाली प्रत्येक सेवा का अपना डेमॉन होता है।

लिनक्स ऑपरेटिंग सिस्टम की कर्नेल संरचना सीखने और विभिन्न सिस्टम आर्किटेक्चर के कामकाज को समझने के लिए डेमॉन को मास्टर करना महत्वपूर्ण है।

एक डेमन क्या है?

आगे पढ़िए

साझा करनाकलरवसाझा करनाईमेल

संबंधित विषय

  • लिनक्स
  • लिनक्स कर्नेल
  • प्रोग्रामिंग
  • सी प्रोग्रामिंग

लेखक के बारे में

फ़ातिह कुकुक्कराकुर्ती (5 लेख प्रकाशित)

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

Fatih Küçükkarakurt की और फ़िल्में या टीवी शो

हमारे समाचार पत्र के सदस्य बनें

तकनीकी युक्तियों, समीक्षाओं, निःशुल्क ई-पुस्तकों और अनन्य सौदों के लिए हमारे न्यूज़लेटर से जुड़ें!

सब्सक्राइब करने के लिए यहां क्लिक करें