एक प्रोग्राम को डेमन के रूप में चलाने और इसे 'और' के साथ पृष्ठभूमि में बनाने के बीच क्या अंतर है?


45

यूनिक्स आधारित प्रणाली पर सेवाओं को तैनात करते समय एक sysadmin बिंदु से व्यावहारिक अंतर क्या हैं?

जवाबों:


31

डोनेमिंग का पारंपरिक तरीका है:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

यह सुनिश्चित करता है कि यह प्रक्रिया अब टर्मिनल के समान प्रक्रिया समूह में नहीं है और इस तरह इसे एक साथ नहीं मारा जाएगा। IO पुनर्निर्देशन टर्मिनल पर दिखाई नहीं देते आउटपुट बनाने के लिए है।


5
इसलिए यदि एक टर्मिनल जो पृष्ठभूमि प्रक्रिया (और) को बंद कर देता है तो पृष्ठभूमि की प्रक्रिया भी समाप्त हो जाएगी?
user1561108

9
जब टर्मिनल से बाहर निकलता है, तो यह प्रक्रिया SIGHUP प्राप्त करेगी, उस सिग्नल के लिए डिफ़ॉल्ट हैंडलर प्रक्रिया को समाप्त करना है।
डेनिस करसेमेकर

12
कृपया &अपने उत्तर में भाग स्पष्टीकरण जोड़ें । यह अधूरा लगता है .. यदि आप मूल प्रश्न की जांच करते हैं।
एमटी

1
ऐसा इसलिए है क्योंकि पृष्ठभूमि के साथ चलने वाली चीजें और प्रक्रिया को कुछ खास नहीं बनाती है :)
डेनिस करसेमेकर

33

डेमॉन के लिए, आप जो चाहते हैं वह एक ऐसी प्रक्रिया है जिसका किसी चीज से कोई संबंध नहीं है। बहुत कम से कम, आप चाहते हैं कि यह अपने स्वयं के सत्र में हो, टर्मिनल से जुड़ा न हो, माता-पिता से किसी भी तरह की कोई फ़ाइल डिस्क्रिप्टर विरासत में नहीं मिली हो, आपके लिए माता-पिता की देखभाल न हो (init के अलावा) /एक umount को रोकने के लिए नहीं के रूप में निर्देशिका ...

एक टर्मिनल से अलग करने के लिए, आप एक नया सत्र बनाते हैं, हालांकि, एक सत्र बनाने के लिए, आपको एक समूह (या सत्र) नेता नहीं होना चाहिए, इसलिए सबसे अच्छा है एक नई प्रक्रिया को कांटा करना। माता-पिता के बाहर निकलने को मान लेने का मतलब यह है कि इस प्रक्रिया का कोई अभिभावक नहीं होगा और इसे init द्वारा अपनाया जाएगा। उसके बाद, सभी संभव फ़ाइल डिस्क्रिप्टर को बंदchdir("/") कर दें , आप ( वर्तमान फ़ाइल को बंद करने के लिए संसाधन की तरह जारी करने के लिए वर्तमान वर्किंग डायरेक्टरी को बंद नहीं कर सकते हैं , जिससे /वर्तमान वर्किंग डायरेक्टरी कम से कम अनमाउंटिंग डाइरेक्टरी को रोक नहीं सकती है)।

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

दूसरे छोर पर, और, इंटरैक्टिव गोले में, कांटे और एक नया प्रक्रिया समूह बनाता है (ताकि टर्मिनल के अग्रभूमि प्रक्रिया समूह में नहीं हो), और गैर-इंटरैक्टिव गोले में, एक प्रक्रिया की तलाश करता है और इसमें SIGINT की उपेक्षा करता है। यह टर्मिनल से अलग नहीं होता है, फ़ाइल विवरणकों को बंद नहीं करता है (हालांकि कुछ गोले स्टड को फिर से खोलेंगे /dev/null) ...


chdir ("/") के लिए क्या उपयोग है? फ़ाइल विवरणक बंद करने के लिए
टिमोथी लेउंग

@ टिमोथीलेउंग, संपादित देखें।
स्टीफन चेज़लस

8

एक प्रोग्राम / प्रक्रिया को डेमॉन के रूप में चलाने और एम्परसेंड का उपयोग करके पृष्ठभूमि के लिए इसे बदलने के बीच का अंतर मूल रूप से स्वामित्व से संबंधित है।

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


1
उपरोक्त प्रक्रिया के तकनीकी पक्ष का उत्तर देने के लिए भी बनाम इसे टर्मिनल के एक बच्चे के रूप में रखने के लिए, आप "nohup फ़ायरफ़ॉक्स और" चलाने की कोशिश कर सकते हैं
Odaym

7

साथ command &आपका प्रक्रिया एक SIGHUP संकेत द्वारा मारे गए हो जाएगा माता-पिता की मृत्यु हो जाती है।

Sysadmins की पहुंच कुछ वर्कअराउंड से है, हालाँकि।

एक बैश सिस्टम पर, आप उपयोग कर सकते हैं:

(trap '' HUP; command) &

यह एक सबहेल खोलता है, HUPसिग्नल को एक खाली हैंडलर और एम्परसैंड / कांटे से फंसाता है।

आउटपुट अभी भी गलत पर पुनर्निर्देशित हो सकता है tty। या खो जाते हैं।
आप ठीक कर सकता है उस के साथ &>command.out, 1>output.outया2>errors.out

आपके पास अधिकांश सिस्टम पर, nohupकमांड तक पहुंच भी हो सकती है ।
nohupइस प्रक्रिया को बहुत सरल करता है। यह काफी मानक है, लेकिन मैंने पाया कि कई बिजीबॉक्स एम्बेडेड एआरएम वितरण इसे गायब कर रहे हैं। आप बस लिखें:

nohup command &

..और आपने कल लिया। आउटपुट पुनर्निर्देशित हो जाता है, IIRC, को nohup.out, लेकिन यह फ़ाइल नाम एक विकल्प के साथ बदला जा सकता है।


2
बस इस बात पर ध्यान दें कि ZSH के साथ आप command &बाद में शेल से अलग कर सकते हैं disownजिसके साथ बाद में नोक के रूप में काम करता है।
गणित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.