2010-06-22 7 views
44

मैं लिनक्स डिमन लिख रहा हूं। मुझे ऐसा करने के दो तरीके मिले।लिनक्स डिमननाइजेशन

  1. Daemonize अपने fork() बुला और sid की स्थापना द्वारा प्रक्रिया।
  2. & के साथ अपना प्रोग्राम चलाना।

ऐसा करने का सही तरीका कौन सा है?

+1

आप नोहप का उपयोग कर सकते हैं: http://stackoverflow.com/questions/958249/whats-the-difference-between-nohup-and-a-daemon – rogerdpack

उत्तर

76

से http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

चरण यहां दिए डेमॉन बनने के लिए कर रहे हैं:

  1. कांटा() इसलिए माता-पिता से बाहर निकल सकते है, इस कमांड लाइन या खोल अपने कार्यक्रम लागू करने के लिए नियंत्रण देता है। इस चरण की आवश्यकता है ताकि नई प्रक्रिया की गारंटी हो कि प्रक्रिया समूह नेता न हो। अगला चरण, setid(), विफल रहता है यदि आप एक प्रक्रिया समूह नेता हैं।
  2. सेटिड() एक प्रक्रिया समूह और सत्र समूह के नेता बनने के लिए। चूंकि एक नियंत्रण टर्मिनल एक सत्र से जुड़ा हुआ है, और इस नए सत्र ने अभी तक एक नियंत्रण टर्मिनल हासिल नहीं किया है, हमारी प्रक्रिया में अब कोई नियंत्रण टर्मिनल नहीं है, जो डेमन्स के लिए एक अच्छी बात है।
  3. कांटा() फिर से माता-पिता, (सत्र समूह नेता), बाहर निकल सकते हैं। इसका मतलब है कि हम, गैर-सत्र समूह के नेता के रूप में, कभी भी नियंत्रण टर्मिनल वापस नहीं ले सकते हैं।
  4. chdir ("/") यह सुनिश्चित करने के लिए कि हमारी प्रक्रिया किसी भी निर्देशिका को उपयोग में नहीं रखती है। ऐसा करने में विफलता यह कर सकती है ताकि कोई व्यवस्थापक फाइल सिस्टम को अनमाउंट नहीं कर सके, क्योंकि यह हमारी वर्तमान निर्देशिका थी। [समान रूप से, हम किसी भी निर्देशिका में बदल सकते हैं जिसमें डेमॉन के ऑपरेशन के लिए महत्वपूर्ण फाइलें हैं।]
  5. उमास्क (0) ताकि हमारे द्वारा लिखे गए किसी भी चीज़ की अनुमतियों पर हमारा पूर्ण नियंत्रण हो। हम नहीं जानते कि उमास्क हमें विरासत में मिला है। [यह चरण वैकल्पिक है]
  6. नज़दीकी() एफडीएस 0, 1, और 2. यह मानक, आउट, और त्रुटि को हमारे मूल प्रक्रिया से विरासत में मिला है। हमारे पास यह जानने का कोई तरीका नहीं है कि इन एफडीएस को रीडायरेक्ट किया गया हो सकता है। ध्यान दें कि कई daemons sysconf() का उपयोग _SC_OPEN_MAX सीमा निर्धारित करने के लिए करते हैं। _SC_OPEN_MAX आपको अधिकतम फ़ाइलों/प्रक्रिया को अधिकतम करता है। फिर एक लूप में, डिमन सभी संभावित फ़ाइल डिस्क्रिप्टर बंद कर सकते हैं। आपको यह तय करना होगा कि आपको ऐसा करने की आवश्यकता है या नहीं। यदि आपको लगता है कि फ़ाइल-डिस्क्रिप्टर खुले हो सकते हैं तो आपको उन्हें बंद करना चाहिए, क्योंकि समवर्ती फ़ाइल वर्णनकर्ताओं की संख्या पर एक सीमा है।
  7. stdin, stdout और stderr के लिए नए खुले डिस्क्रिप्टर स्थापित करें। भले ही आप उनका उपयोग करने की योजना नहीं बनाते हैं, फिर भी उन्हें खोलने का एक अच्छा विचार है।इनमें से सटीक हैंडलिंग स्वाद का विषय है; अगर आपके पास लॉगफाइल है, उदाहरण के लिए, आप इसे stdout या stderr के रूप में खोलना चाहते हैं, और stdin के रूप में '/ dev/null' खोलें; वैकल्पिक रूप से, आप '/ dev/console' को stderr और/या stdout के रूप में खोल सकते हैं, और '/ dev/null' stdin के रूप में, या कोई अन्य संयोजन जो आपके विशेष डिमन के लिए समझ में आता है।

अभी तक बेहतर, बस daemon() समारोह अगर यह उपलब्ध है कहते हैं।

+1

आपको सभी खुले डिस्क्रिप्टर बंद करना होगा। अन्यथा फ़ाइलों में एक संदर्भ जारी रह सकता है, जो उन्हें हटाए जाने से रोक देगा, उदाहरण के लिए। यह chdir ("/") की तरह है। –

+2

@ एन-एलेक्सैंडर्सो - डेमन() डबल फोर्क है? – Dannyboy

+1

रूबी वेबब्रिक डिमननाइजेशन (टॉगल स्रोत) पर एक अच्छा उदाहरण: http://ruby-doc.org/stdlib-2.1.1/libdoc/webrick/rdoc/WEBrick/Daemon.html –

2

वास्तव में एक डेमॉन बनाने के लिए आपको कांटा डबल करना होगा।

& के साथ प्रोग्राम को चलाने से शैल पृष्ठभूमि में प्रोग्राम चलाता है, जो इसे एक डिमन नहीं बनाता है। डेमन्स में माता-पिता के रूप में init (pid 1) है, यही कारण है कि डबल कांटा की आवश्यकता है।

तो यदि आपका प्रोग्राम एक डिमन है, तो चीजों को करने का अच्छा तरीका है, इस समस्या का ख्याल रखना होगा (और अधिक विधियां हैं, here भी देखें)। आप स्टार्ट-स्टॉप-डिमन प्रोग्राम का भी उपयोग कर सकते हैं।

5

पहला। दूसरा deemonizing नहीं है, लेकिन पृष्ठभूमि पर चल रहा है। डेमोनिज्ड प्रोग्राम अपने सत्र और प्रक्रिया समूह पर होना चाहिए, और पर नियंत्रण कक्ष होना चाहिए।

+1

लेकिन मैं अभी भी समझ नहीं पा रहा हूं कि अपना सत्र सेट करने का क्या उपयोग है और प्रक्रिया समूह – Poorna

2

आप किस भाषा का उपयोग कर रहे हैं? कुछ भाषाओं में सहायक विधियां होती हैं जो डेमोनाइज़िंग को आसान बनाती हैं। उदाहरण के लिए, रूबी में daemons पैकेज है।

+0

हम सी ++ – Poorna

11

बस daemon(3) (unistd.h से) का उपयोग करें।

डेमॉन() फ़ंक्शन कार्यक्रमों को नियंत्रित करने टर्मिनल से खुद को अलग कर प्रणाली डेमॉन के रूप में पृष्ठभूमि में चलाने के लिए इच्छुक के लिए है। ...

+0

का उपयोग कर रहे हैं मैंने कई दिनों तक जांच की है कि मैं आपकी सलाह देखे जाने तक जेनकिन्स का उपयोग करके उबंटू पर डेमॉन के रूप में फ्लास्क एप्लिकेशन कैसे चला सकता हूं। धन्यवाद! मेरी समस्या हल कमांड 'निर्यात BUILD_ID = dontKillMe' ' डेमन फ्लास्क रन ' – barbarian

28

मैं सुझाव देता हूं कि आपका प्रोग्राम एक डिमन के रूप में नहीं लिख रहा है। इसे फ़ाइल डिस्क्रिप्टर, वर्तमान निर्देशिका, प्रक्रिया समूह इत्यादि के साथ अग्रभूमि में चलाएं जैसा कि दिया गया है।

यदि आप इस प्रोग्राम को डिमन के रूप में चलाने के लिए चाहते हैं, तो स्टार्ट-स्टॉप-डिमन (8), इनिट (8), रनव (रनिट से), अपस्टार्ट, सिस्टमडी, या जो भी आपकी प्रक्रिया को डिमन के रूप में लॉन्च करना है । यही है, अपने उपयोगकर्ता को यह तय करने दें कि आपका प्रोग्राम कैसे चलाया जाए और यह लागू न करें कि इसे डेमॉन के रूप में चलाना चाहिए।

+6

+1 के साथ हल की गई समस्या। कम से कम, अग्रभूमि में चलाने का विकल्प प्रदान करें। –

+0

पुराना उत्तर लाने के लिए खेद है, लेकिन क्या मॉनिट आपकी प्रक्रिया को डिमन के रूप में भी लॉन्च कर सकता है? – allaire