Systemd में, After = और Essential = के बीच क्या अंतर है?


53

मैं एक systemd .service फ़ाइल बना रहा हूं और मैं के बीच अंतर को समझने में सहायता की जरूरत है Requires=और After=आदमी पेज का कहना है कि Requires="अन्य इकाइयों पर आवश्यकता निर्भरता कॉन्फ़िगर करती है।" और After="इकाइयों के बीच निर्भरता के आदेश को कॉन्फ़िगर करता है।" क्या फर्क पड़ता है?

जवाबों:


43

After=सेवा आदेश को कॉन्फ़िगर करता है (केवल Y के बाद X करें), जबकि Requires=राज्य निर्भरता। यदि आप कोई आदेश निर्दिष्ट नहीं करते हैं, तो दूसरे पर निर्भर एक सेवा उसी समय शुरू की जाएगी, जिस पर वह निर्भर है। इसके अलावा, जिस तरह से मैं इसे समझता हूं (हालांकि मैं अब परीक्षण नहीं कर सकता हूं और एक संदर्भ नहीं ढूंढ सकता हूं), After=एक "ढीली युग्मन" है, और इस तरह के एक बयान के साथ एक सेवा अभी भी चलेगी यदि कोई After=लाइन में नाम नहीं है टी बिल्कुल भी Require=शुरू नहीं हुई , जबकि अगर आवश्यकता पूरी नहीं हुई तो इसे रोक दिया जाएगा।

Https://www.freedesktop.org/software/systemd/man/systemd.unit.html का हवाला देते हुए :

= आवश्यक है

अन्य इकाइयों पर आवश्यकता निर्भरता को कॉन्फ़िगर करता है। यदि यह इकाई सक्रिय हो जाती है, तो यहां सूचीबद्ध इकाइयाँ भी सक्रिय हो जाएंगी। यदि अन्य इकाइयों में से एक निष्क्रिय हो जाती है या इसकी सक्रियता विफल हो जाती है, तो यह इकाई निष्क्रिय हो जाएगी। यह विकल्प एक से अधिक बार निर्दिष्ट किया जा सकता है या एक से अधिक स्थान-पृथक इकाइयों को एक विकल्प में निर्दिष्ट किया जा सकता है जिसमें सभी सूचीबद्ध नामों के लिए मामले की आवश्यकता निर्भरताएं बनाई जाएंगी। ध्यान दें कि आवश्यकता निर्भरता उस क्रम को प्रभावित नहीं करती है जिसमें सेवाएं शुरू या बंद की जाती हैं। इसे बाद में = या इससे पहले = विकल्पों के साथ स्वतंत्र रूप से कॉन्फ़िगर करना होगा। यदि एक इकाई foo.service को एक इकाई बार की आवश्यकता होती है। आवश्यकता के अनुरूप कॉन्फ़िगर किया गया = और कोई आदेश बाद = या इससे पहले = के साथ कॉन्फ़िगर नहीं किया जाता है, तो दोनों इकाइयों को एक साथ शुरू किया जाएगा और उनके बीच किसी भी देरी के बिना अगर foo.service सक्रिय है। अक्सर,

तथा

पहले = बाद में =

इकाई नामों की एक अंतरिक्ष-पृथक सूची। इकाइयों के बीच निर्भरता के आदेश को कॉन्फ़िगर करता है। यदि एक इकाई foo.service में पहले = bar.service की सेटिंग है और दोनों इकाइयाँ शुरू की जा रही हैं, तो f..ervice शुरू होने तक bar.service के स्टार्ट-अप में देरी हो रही है। ध्यान दें कि यह सेटिंग आवश्यकता के अनुसार कॉन्फ़िगर की गई आवश्यकताओं पर निर्भर है। आफ्टर = और आवश्यकता = विकल्प दोनों में एक यूनिट नाम शामिल करना एक सामान्य पैटर्न है, जिस स्थिति में सूचीबद्ध यूनिट को इन विकल्पों के साथ कॉन्फ़िगर किए गए यूनिट से पहले शुरू किया जाएगा। यह विकल्प एक से अधिक बार निर्दिष्ट किया जा सकता है, जिस स्थिति में सभी सूचीबद्ध नामों के लिए निर्भरता पैदा होती है। आफ्टर = से पहले = का उलटा है, जबकि बाद में = यह सुनिश्चित करता है कि कॉन्फ़िगर की गई यूनिट को सूचीबद्ध यूनिट के शुरू होने के बाद शुरू किया गया है, इससे पहले = विपरीत को सुनिश्चित करता है, अर्थात सूचीबद्ध इकाई शुरू होने से पहले कॉन्फ़िगर इकाई पूरी तरह से शुरू हो जाती है। ध्यान दें कि जब उनके बीच एक ऑर्डरिंग निर्भरता वाली दो इकाइयां बंद हो जाती हैं, तो स्टार्ट-अप ऑर्डर का व्युत्क्रम लागू होता है। यदि एक इकाई को किसी अन्य इकाई पर After = के साथ कॉन्फ़िगर किया जाता है, तो दोनों बंद होने पर पूर्व को बाद में रोक दिया जाता है। उनके बीच किसी भी आदेश निर्भरता वाली दो इकाइयों को देखते हुए, यदि एक इकाई बंद हो जाती है और दूसरी शुरू हो जाती है, तो स्टार्ट-अप से पहले शटडाउन का आदेश दिया जाता है। इससे कोई फर्क नहीं पड़ता कि ऑर्डर निर्भरता के बाद = या इससे पहले = है। यह भी कोई फर्क नहीं पड़ता कि दोनों में से कौन बंद है, जब तक कि एक बंद हो जाता है और दूसरा शुरू हो जाता है। सभी मामलों में स्टार्ट-अप से पहले शटडाउन का आदेश दिया गया है। यदि दो इकाइयों के बीच कोई आदेश निर्भरता नहीं है, तो वे बंद हो जाते हैं या एक साथ शुरू हो जाते हैं,


7
यदि आदेश का विवरण नहीं है तो क्या निर्भरता है? (गंभीरता से ... मुझे अंतर समझ में नहीं आता)
टॉमऑनटाइम

मेरा संपादन देखें। मेरी समझ: After=Xका अर्थ होगा " यदि एक्स के बाद यह किया जाता है तो एक्स करें", जबकि Require=Xइसका अर्थ होगा "यदि आप एक्स नहीं कर सकते हैं तो ऐसा बिल्कुल भी न करें"।
स्वेन

Before=मैन पेज का सेक्शन इसकी पुष्टि करता प्रतीत होता है। If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up जिस तरह से मैं समझता हूं कि, यदि bar.serviceकिसी भी तरह से शुरू नहीं किया गया है और foo.serviceसामान्य रूप से शुरू होगा , तो आदेश लागू नहीं किया जाएगा।
स्वेन

10

एक प्रमुख अंतर यह है कि,

  • After केवल जाँचता है कि क्या इकाई पहले से ही सक्रिय है, और स्पष्ट रूप से निर्दिष्ट इकाइयों को सक्रिय नहीं करता है।
  • सूचीबद्ध इकाइयों को Requiresएक साथ इकाई के साथ सक्रिय किया जाता है। यदि आवश्यक इकाइयों में से कोई भी शुरू करने में विफल रहता है, तो इकाई सक्रिय नहीं होती है।

विचार करें कि मेरे पास एक इकाई फ़ाइल है test-app.service,

[Unit]
Description=test app
After=network-online.target

इस कथन को निष्पादित करने पर क्या होगा,

  • Afterअगर जाँच करता है network-online.target
  • यदि network-online.targetशुरू नहीं किया गया है, तो यह इंतजार करेगा।
  • test-appnetwork-online.targetसक्रिय होने के बाद ही शुरू होता है

अगर मुझे इसके Requiresबजाय,

[Unit]
Description=test app
Requires=network-online.target

इस कथन को निष्पादित करने पर क्या होगा,

  • network-online.targetऔर test-appएक साथ सक्रिय होते हैं
  • यदि network-online.targetप्रारंभ करने में विफल रहता है तो test-appसक्रिय नहीं किया जाएगा।

2

systemd एक नौकरी प्रबंधक है। मैन पेज बहुत सटीक नहीं है कि चीजें कैसे काम करती हैं।

जब आप बूट करते हैं, तो एंकर जॉब के लिए जॉब्स से जुड़े लेन-देन का निर्माण क्या करता है। (यानी डिफॉल्ट के लिए जॉब शुरू करें)। ये सभी निर्भरताएं और रिश्ते क्या परिभाषित करते हैं कि कैसे और क्या नौकरियों को ट्रिगर किया जाएगा। आदेश देना यह निर्धारित करता है कि कौन सी नौकरी (नौकरी) हर दूसरे काम पर इंतजार करेगी। Default.target इकाई इसलिए इस सब के केंद्र में है, यही कारण है कि जब आप इकाइयों को एक रिवर्स निर्भरता का उपयोग करते हुए सक्षम करते हैं, जो कि systemctl enable के माध्यम से एक फाइलसिस्टम प्रतीकात्मक लिंक बनाता है, जो आगे निर्भरता प्रणाली को दर्शाता है, तो यह भी अनुसरण कर सकता है कि आपको सिस्टम की सहानुभूति की आवश्यकता क्यों है। पहले स्थान पर)। ऐसा ही तब है जब आप मैन्युअल रूप से कुछ इकाई शुरू करते हैं, तो वह इकाई लंगर है, और लेन-देन की गणना की जाती है।

बहुत अधिक विस्तार में नहीं, मैं समझाता हूँ कि क्या = और बाद = की आवश्यकता है।

आवश्यकता होती है = सिस्टमड के कारण आवश्यक इकाई के लिए एक स्टार्ट जॉब को ट्रिगर करने के लिए होगा जब आपको एक स्टार्ट जॉब ट्रिगर (स्पष्ट रूप से, या एक निर्भरता के माध्यम से: आंतरिक रूप से कोई अंतर नहीं है) मिलता है। यह इकाई बंद होने पर आप पर एक स्टॉप जॉब को ट्रिगर करने का गुण भी रखता है (नोट: रोका गया, अपने आप नीचे नहीं जा रहा) या फिर से शुरू हुआ। इसका मतलब यह है कि अगर कुछ निर्भरता / systemctl इसे रोकने / पुनः आरंभ करने का कारण बनता है, तो आप भी रोकेंगे / पुनरारंभ करेंगे। हालांकि, अगर यह अपने आप नीचे चला जाता है, तो आप नहीं रुकेंगे, क्योंकि कोई नौकरी नहीं थी, और राज्य परिवर्तन सिस्टमड की भागीदारी के बिना हुआ। यहीं आप BindsTo = का उपयोग करेंगे (डिवाइस इकाइयों के समान, जो स्पष्ट कारणों के लिए सिस्टमड की भागीदारी के बिना निष्क्रिय हो सकते हैं)।

अब, आफ्टर = के उपयोग की सिफारिश की जाती है क्योंकि आवश्यकता के लिए अकेले ही यह पर्याप्त है: यदि जॉब शुरू नहीं होती है तो रिक्वायरमेंट रद्द कर दें। हालांकि यह रद्द करना केवल wrt जॉब का काम करता है, अर्थात यदि दूसरी इकाई ऑर्डरिंग को परिभाषित नहीं करती है, तो systemd समानांतर में दोनों को ट्रिगर करता है, और यदि आपकी स्टार्ट जॉब के पूरा होने से पहले इसकी शुरुआत खत्म हो जाती है, तो इसे रद्द नहीं किया जाएगा (इसे रद्द नहीं किया जा सकता है, वास्तव में) । आफ्टर = के उपयोग का अर्थ है कि अन्य नौकरी आवश्यक इकाई के शुरू होने तक इंतजार करती रहती है, और परिणाम के आधार पर, यदि यह विफल हो जाता है, तो आपकी इकाई की प्रतीक्षा शुरू की नौकरी JOB_DEPENDENCY नौकरी के परिणाम के साथ रद्द कर दी जाती है (आप पीले क्यों पड़ते हैं [DEPEND] ऐसे मामलों के लिए बूट)। इसलिए, यह अमान्य प्रभाव After = के उपयोग के बिना पूर्व निर्धारित है।

यही कारण है कि Wants = without After = का उपयोग करना ठीक है यदि आप अन्य इकाई के स्टार्टअप के लिए इंतजार नहीं करना चाहते हैं: क्योंकि वहां कोई अमान्य नहीं है, इसलिए कोई दौड़ नहीं है। उस मामले में, यह एक तुल्यकालन तंत्र से अधिक नहीं है।

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

अब यदि कोई नौकरी नहीं है, तो आदेश का उक्त इकाई के लिए कोई प्रभाव नहीं है। हालाँकि, आमतौर पर एक नौकरी होती है, इसके लिए निर्भरता के उपयोग की आवश्यकता होती है जैसे = और वांट्स =, या दोनों एक समय में खींचे जाते हैं और कुछ ऑर्डर को परिभाषित करते हैं, जिस स्थिति में वे दूसरी इकाई की नौकरी पर इंतजार करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.