सवाल लिनक्स deemonize


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

  1. कॉल करके अपनी प्रक्रिया को निंदा करें fork() और सेटिंग sid
  2. के साथ अपने कार्यक्रम चल रहा है &

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


44
2018-06-22 17:30


मूल


आप नोहप का उपयोग कर सकते हैं: stackoverflow.com/questions/958249/... - rogerdpack


जवाब:


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

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

  1. कांटा () ताकि माता-पिता बाहर निकल सकें, यह आपके प्रोग्राम को आविष्कार करने वाली कमांड लाइन या खोल पर नियंत्रण देता है। इस चरण की आवश्यकता है ताकि नई प्रक्रिया की गारंटी हो कि प्रक्रिया समूह नेता न हो। अगला चरण, setid (), विफल रहता है यदि आप एक प्रक्रिया समूह नेता हैं।
  2. सेटिड () एक प्रक्रिया समूह और सत्र समूह के नेता बनने के लिए। चूंकि एक नियंत्रण टर्मिनल एक सत्र से जुड़ा हुआ है, और इस नए सत्र ने अभी तक एक नियंत्रण टर्मिनल हासिल नहीं किया है, हमारी प्रक्रिया में अब कोई नियंत्रण टर्मिनल नहीं है, जो डेमन्स के लिए एक अच्छी बात है।
  3. कांटा () फिर से माता-पिता, (सत्र समूह नेता), बाहर निकल सकते हैं। इसका मतलब है कि हम, गैर-सत्र समूह के नेता के रूप में, कभी भी नियंत्रण टर्मिनल वापस नहीं ले सकते हैं।
  4. chdir ("/") यह सुनिश्चित करने के लिए कि हमारी प्रक्रिया किसी भी निर्देशिका को उपयोग में नहीं रखती है। ऐसा करने में विफलता यह कर सकती है ताकि कोई व्यवस्थापक फाइल सिस्टम को अनमाउंट नहीं कर सके, क्योंकि यह हमारी वर्तमान निर्देशिका थी। [समान रूप से, हम किसी भी निर्देशिका में बदल सकते हैं जिसमें डेमॉन के ऑपरेशन के लिए महत्वपूर्ण फाइलें हैं।]
  5. उमास्क (0) ताकि हमारे द्वारा लिखे गए किसी भी चीज़ की अनुमतियों पर हमारा पूर्ण नियंत्रण हो। हम नहीं जानते कि उमास्क हमें विरासत में मिला है। [यह कदम वैकल्पिक है]
  6. बंद करें () fds 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 के रूप में, या कोई अन्य संयोजन जो आपके विशेष डिमन के लिए समझ में आता है।

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


77
2018-06-22 17:38



आपको सभी खुले डिस्क्रिप्टर बंद करना होगा। अन्यथा फ़ाइलों में एक संदर्भ जारी रह सकता है, जो उन्हें हटाए जाने से रोक देगा, उदाहरण के लिए। यह chdir ("/") की तरह है। - n-alexander
@ एन-एलेक्सेंडर्सो - डेमन () डबल फोर्क है? - Dannyboy
रूबी वेबब्रिक डिमननाइजेशन (टॉगल स्रोत) पर एक अच्छा उदाहरण: ruby-doc.org/stdlib-2.1.1/libdoc/webrick/rdoc/WEBrick/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
जैसा कि आप लिनक्स पर चाहते हैं डेमॉन () काम नहीं कर सकता है। डेमन () मैन पेज से: "इस समारोह का जीएनयू सी लाइब्रेरी कार्यान्वयन बीएसडी से लिया गया था, और डबल-कांटा तकनीक (यानी, कांटा (2), सेटिड (2), कांटा (2)) को नियोजित नहीं करता है यह सुनिश्चित करने के लिए आवश्यक है कि परिणामस्वरूप डेमॉन प्रक्रिया सत्र सत्र नहीं है। इसके बजाए, परिणामी डिमन एक सत्र नेता है। " - Jon Spencer


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

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


29
2018-06-23 04:10



+1। कम से कम, अग्रभूमि में चलाने का विकल्प प्रदान करें। - Nicholas Wilson
पुराना उत्तर लाने के लिए खेद है, लेकिन क्या मॉनिट आपकी प्रक्रिया को डिमन के रूप में भी लॉन्च कर सकता है? - allaire


महज प्रयोग करें daemon(3) (से unistd.h)।

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


12
2018-06-22 17:49



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


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


5
2018-06-22 17:37



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


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

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

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


2
2018-06-22 17:37





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


2
2018-06-22 17:39



हम सी ++ का उपयोग कर रहे हैं - Poorna