सिस्टमड नेटवर्क कॉन्फ़िगरेशन निर्भरता पर
सिस्टमड की यूनिट ऑर्डरिंग को प्रभावित करना बहुत आसान है। दूसरी ओर आपको इस बात से सावधान रहने की आवश्यकता है कि एक पूर्ण इकाई क्या गारंटी देती है।
अपनी सेवा को कॉन्फ़िगर करें
वर्तमान प्रणालियों पर, आदेश देने के बाद network.target
बस गारंटी दी जाती है कि नेटवर्क सेवा शुरू की गई है, न कि कुछ वास्तविक कॉन्फ़िगरेशन। आपको network-online.target
इसे प्राप्त करने के लिए ऑर्डर करने और इसे खींचने की आवश्यकता है।
[Unit]
Wants=network-online.target
After=network-online.target
पुराने सिस्टम के साथ संगतता के लिए, आपको network.target के बाद भी ऑर्डर करना पड़ सकता है।
[Unit]
Wants=network-online.target
After=network.target network-online.target
यह आपकी सेवा की इकाई फ़ाइल के लिए और सिस्टमड के लिए है।
सॉफ्टवेयर के वर्तमान संस्करणों में कार्यान्वयन
अब आपको यह सुनिश्चित करने की आवश्यकता है कि network-online.target
अपेक्षा के अनुसार काम करता है (या जिसे आप कम से कम उपयोग कर सकते हैं network.target
)।
NetworkManager का वर्तमान संस्करण प्रदान करता है NetworkManager-wait-online.service
जो network-online.target
आपकी सेवा के द्वारा और इस तरह से खींचा जाता है । यह विशेष सेवा यह सुनिश्चित करती है कि आपकी सेवा तब तक प्रतीक्षा करेगी जब तक कि कॉन्फ़िगर किए गए सभी कनेक्शन स्वचालित रूप से सफल, विफल या समय समाप्त न होने लगें।
सिस्टमड-नेटवर्कड का वर्तमान संस्करण आपकी सेवा को तब तक अवरुद्ध करता है जब तक कि सभी डिवाइस अनुरोध के अनुसार कॉन्फ़िगर न हो जाएं। यह आसान है कि यह वर्तमान में केवल उन कॉन्फ़िगरेशन का समर्थन करता है जो बूट समय पर लागू होते हैं (विशेष रूप से `systemd-networkd.service का स्टार्टअप समय)।
पूर्णता के लिए, /etc/init.d/network
फेडोरा में सेवा, सिस्टमड, ब्लॉकों के वर्तमान संस्करणों network.target
और इस प्रकार अप्रत्यक्ष रूप से ब्लॉक network-online.target
और आपकी सेवा के रूप में व्याख्या की गई है । यह स्क्रिप्ट आधारित कार्यान्वयन का एक उदाहरण है।
यदि आपका कार्यान्वयन, चाहे डेमन बेस्ड या स्क्रिप्ट आधारित हो, ऊपर नेटवर्क प्रबंधन सेवाओं में से एक के रूप में व्यवहार करता है, तो यह आपकी सेवा के शुरू होने में देरी करेगा जब तक कि नेटवर्क कॉन्फ़िगरेशन या तो सफलतापूर्वक पूरा नहीं हो जाता है, एक अच्छे कारण के लिए विफल हो जाता है, या एक उचित समय के बाद समाप्त हो जाता है। पूरा करने के लिए फ्रेम।
आप जांच सकते हैं कि क्या netctl उसी तरह काम करता है और यह जानकारी इस उत्तर के लिए एक मूल्यवान अतिरिक्त होगी।
सॉफ्टवेयर के पुराने संस्करणों में कार्यान्वयन
मुझे नहीं लगता कि आपको सिस्टमड का एक पुराना संस्करण दिखाई देगा जहां यह अच्छी तरह से काम नहीं करेगा। लेकिन आप जांच सकते हैं कि कम से कम network-online.target
मौजूद है और इसके बाद आदेश दिया जाता है network.target
।
पहले NetworkManager ने केवल गारंटी दी थी कि कम से कम एक कनेक्शन लागू होगा। और यहां तक कि काम करने के लिए, आपको NetworkManager-wait-online.service
स्पष्ट रूप से सक्षम करना होगा । यह लंबे समय से फेडोरा में तय किया गया था लेकिन हाल ही में अपस्ट्रीम में लागू किया गया था।
systemctl enable NetworkManager-wait-online.service
Network.target और network-online.target कार्यान्वयन पर नोट्स
आपको कभी भी अपने सॉफ़्टवेयर को NetworkManager.service
या NetworkManager-wait-online.service
किसी अन्य विशिष्ट सेवाओं पर निर्भर रहने की आवश्यकता नहीं होनी चाहिए । इसके बजाय, सभी नेटवर्क प्रबंधन सेवाओं को पहले network.target
और वैकल्पिक रूप से खुद को आदेश देना चाहिए network-online.target
।
एक सरल स्क्रिप्ट आधारित नेटवर्क प्रबंधन सेवा को बाहर निकलने से पहले नेटवर्क कॉन्फ़िगरेशन को समाप्त करना चाहिए network.target
और इससे पहले कि अप्रत्यक्ष रूप से पहले खुद को आदेश देना चाहिए network-online.target
।
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
एक डेमन बेस्ड नेटवर्क मैनेजमेंट सर्विस को इससे पहले network.target
भी खुद ऑर्डर करना चाहिए , हालांकि यह बहुत उपयोगी नहीं है।
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
एक सेवा जो डेमॉन के खत्म होने का इंतजार करती है उसे विशिष्ट सेवा के बाद और उससे पहले खुद को ऑर्डर करना चाहिए network-online.target
। यह Requisite
डेमॉन सेवा पर उपयोग करना चाहिए ताकि संबंधित नेटवर्क प्रबंधन सेवा का उपयोग नहीं होने पर यह तुरंत विफल हो जाए।
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
पैकेज को wants
निर्देशिका में प्रतीक्षा सेवा के लिए एक सिमलिंक स्थापित करना चाहिए network-online.target
ताकि यह उन सेवाओं द्वारा खींचा जाए जो कॉन्फ़िगर किए गए नेटवर्क के लिए इंतजार करना चाहते हैं।
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
संबंधित दस्तावेज
अंतिम नोट्स
मुझे आशा है कि मैंने न केवल आपके द्वारा पूछे गए समय पर आपके प्रश्न का उत्तर देने में मदद की, बल्कि अपस्ट्रीम और लिनक्स वितरण में स्थिति को बेहतर बनाने में भी योगदान दिया, ताकि मैं अब मूल उत्तर लिखने के समय की तुलना में बेहतर उत्तर दे सकूं ।