यूनिक्स आधारित प्रणाली पर सेवाओं को तैनात करते समय एक sysadmin बिंदु से व्यावहारिक अंतर क्या हैं?
यूनिक्स आधारित प्रणाली पर सेवाओं को तैनात करते समय एक sysadmin बिंदु से व्यावहारिक अंतर क्या हैं?
जवाबों:
डोनेमिंग का पारंपरिक तरीका है:
fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
यह सुनिश्चित करता है कि यह प्रक्रिया अब टर्मिनल के समान प्रक्रिया समूह में नहीं है और इस तरह इसे एक साथ नहीं मारा जाएगा। IO पुनर्निर्देशन टर्मिनल पर दिखाई नहीं देते आउटपुट बनाने के लिए है।
&
अपने उत्तर में भाग स्पष्टीकरण जोड़ें । यह अधूरा लगता है .. यदि आप मूल प्रश्न की जांच करते हैं।
डेमॉन के लिए, आप जो चाहते हैं वह एक ऐसी प्रक्रिया है जिसका किसी चीज से कोई संबंध नहीं है। बहुत कम से कम, आप चाहते हैं कि यह अपने स्वयं के सत्र में हो, टर्मिनल से जुड़ा न हो, माता-पिता से किसी भी तरह की कोई फ़ाइल डिस्क्रिप्टर विरासत में नहीं मिली हो, आपके लिए माता-पिता की देखभाल न हो (init के अलावा) /
एक umount को रोकने के लिए नहीं के रूप में निर्देशिका ...
एक टर्मिनल से अलग करने के लिए, आप एक नया सत्र बनाते हैं, हालांकि, एक सत्र बनाने के लिए, आपको एक समूह (या सत्र) नेता नहीं होना चाहिए, इसलिए सबसे अच्छा है एक नई प्रक्रिया को कांटा करना। माता-पिता के बाहर निकलने को मान लेने का मतलब यह है कि इस प्रक्रिया का कोई अभिभावक नहीं होगा और इसे init द्वारा अपनाया जाएगा। उसके बाद, सभी संभव फ़ाइल डिस्क्रिप्टर को बंदchdir("/")
कर दें , आप ( वर्तमान फ़ाइल को बंद करने के लिए संसाधन की तरह जारी करने के लिए वर्तमान वर्किंग डायरेक्टरी को बंद नहीं कर सकते हैं , जिससे /
वर्तमान वर्किंग डायरेक्टरी कम से कम अनमाउंटिंग डाइरेक्टरी को रोक नहीं सकती है)।
क्योंकि यह प्रक्रिया एक सत्र नेता है, इसलिए एक जोखिम है कि अगर यह कभी भी एक टर्मिनल डिवाइस खोलता है, तो यह उस टर्मिनल की नियंत्रित प्रक्रिया बन जाती है। दूसरी बार फोर्क करना सुनिश्चित करता है कि ऐसा नहीं होता है।
दूसरे छोर पर, और, इंटरैक्टिव गोले में, कांटे और एक नया प्रक्रिया समूह बनाता है (ताकि टर्मिनल के अग्रभूमि प्रक्रिया समूह में नहीं हो), और गैर-इंटरैक्टिव गोले में, एक प्रक्रिया की तलाश करता है और इसमें SIGINT की उपेक्षा करता है। यह टर्मिनल से अलग नहीं होता है, फ़ाइल विवरणकों को बंद नहीं करता है (हालांकि कुछ गोले स्टड को फिर से खोलेंगे /dev/null
) ...
एक प्रोग्राम / प्रक्रिया को डेमॉन के रूप में चलाने और एम्परसेंड का उपयोग करके पृष्ठभूमि के लिए इसे बदलने के बीच का अंतर मूल रूप से स्वामित्व से संबंधित है।
सबसे अधिक बार, एक डेमन की मूल प्रक्रिया एक init प्रक्रिया है (एक यूनिक्स प्रणाली पर शुरू की जाने वाली पहली प्रक्रिया), डेमन उस प्रक्रिया का एक बच्चा होने का मतलब है कि यह एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में आपके सीधे नियंत्रण में नहीं है । दूसरी ओर, पृष्ठभूमि के लिए एक कार्यक्रम / प्रक्रिया को फोर्क करने का मतलब है कि आप किसी भी समय इसे अग्रभूमि में वापस बुला सकते हैं और / या इसे मार सकते हैं।
साथ command &
आपका प्रक्रिया एक SIGHUP संकेत द्वारा मारे गए हो जाएगा माता-पिता की मृत्यु हो जाती है।
Sysadmins की पहुंच कुछ वर्कअराउंड से है, हालाँकि।
एक बैश सिस्टम पर, आप उपयोग कर सकते हैं:
(trap '' HUP; command) &
यह एक सबहेल खोलता है, HUP
सिग्नल को एक खाली हैंडलर और एम्परसैंड / कांटे से फंसाता है।
आउटपुट अभी भी गलत पर पुनर्निर्देशित हो सकता है tty
। या खो जाते हैं।
आप ठीक कर सकता है उस के साथ &>command.out
, 1>output.out
या2>errors.out
आपके पास अधिकांश सिस्टम पर, nohup
कमांड तक पहुंच भी हो सकती है ।
nohup
इस प्रक्रिया को बहुत सरल करता है। यह काफी मानक है, लेकिन मैंने पाया कि कई बिजीबॉक्स एम्बेडेड एआरएम वितरण इसे गायब कर रहे हैं। आप बस लिखें:
nohup command &
..और आपने कल लिया। आउटपुट पुनर्निर्देशित हो जाता है, IIRC, को nohup.out
, लेकिन यह फ़ाइल नाम एक विकल्प के साथ बदला जा सकता है।
command &
बाद में शेल से अलग कर सकते हैं disown
जिसके साथ बाद में नोक के रूप में काम करता है।