मैं यह कैसे सुनिश्चित कर सकता हूं कि एक अपस्टार्ट नौकरी अन्य अपार्टार्ट नौकरियों से पहले शुरू हो जाए?


33

यह एक सामान्य अपस्टार्ट प्रश्न है, लेकिन मुझे एक विशिष्ट मामले का उपयोग करने दें:

Centrify ActiveDirectory गेटवे के लिए एक NIS है। इसे किसी भी सेवा से पहले लोड करने की आवश्यकता है जो प्रमाणीकरण सेवा पर निर्भर करेगा जो इसे प्रदान करता है, जैसे ऑटोफोकस, क्रोन, एनआईएस, एट अल।

यह हासिल करने के लिए काफी चुनौतीपूर्ण साबित हुआ है, यहां तक ​​कि जब अन्य सेवाओं की निर्भरता को बदलने की कोशिश कर रहा है (जो मुझे नहीं लगता कि हमें वैसे भी करना चाहिए, मैं अन्य उपकार्ट नौकरियों को छूना नहीं चाहता हूं यदि संभव हो तो) ।

सुझाव?

जवाबों:


29

समाधान को दूसरी दिशा से समस्या का सामना करना पड़ता है: Centrify के लिए शुरू मानदंडों को संतुष्ट करने के लिए, मौजूदा सेवाओं को नई Centrify सेवा पर निर्भर करना आवश्यक नहीं है, बल्कि नई Centrify सेवा को मौजूदा सेवाओं पर निर्भर करना है।

उदाहरण के लिए, अपस्टार्ट कॉन्फ़िगरेशन फ़ाइल /etc/init/centrify.confकह सकती है:

पर शुरू करें (क्रोन शुरू करना या ऑटोफ़्स शुरू करना या निस शुरू करना)

इसे अंग्रेजी में परिवर्तित करते हुए, यह इस प्रकार अनुवाद करेगा:

या तो क्रोन, ऑटोफ़ या निस प्रारंभ (जो भी पहले शुरू होता है) के ठीक पहले Centrify सेवा शुरू करें ।

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

यह भी ध्यान दें कि अपस्टार्ट उस पहली सेवा की शुरुआत को रोक देगा जो सेंट्रिफाई शुरू होने तक चलना चाहती है।

इस तरीके से सोचने के अभ्यस्त होने के बाद एक बार बहुत ही सुंदर और सरल।


4
यह मुझे पूरी तरह से पीछे की ओर लगता है। एक सेवा के लिए गोपनीय स्क्रिप्ट को क्यों संशोधित किया जाना चाहिए जब अन्य चीजें इस पर निर्भर करती हैं ?
बेन डब्ल्यू

3
@benw ताकि आपको सेवाओं की मौजूदा सेटिंग्स को संशोधित न करना पड़े जो आपके पास नहीं है।
पाक्क जूल

1
@Pcccc जब मैं एक नई स्क्रिप्ट लिखता हूं जो nginx पर निर्भर करता है, तो मुझे nginx के लिए conf स्क्रिप्ट को संशोधित करना होगा ... जो मेरे पास नहीं है।
बेन w

2
क्यों आप start on (started nginx)अपनी नई स्क्रिप्ट में उपयोग नहीं कर सकते ?
पाक्क

2
@ सच में नहीं। start on (started nginx)इसका मतलब है "मेरी सेवा nginx के बाद शुरू करें"। जो "मेरी सेवा से पहले nginx शुरू करने जैसा नहीं है क्योंकि इसे इसकी आवश्यकता है"।
बीमारी

12

जेम्स का जवाब 1 से 1 निर्भरता के लिए काम करता है। 1 से कई के लिए, यानी, बी, सी और डी से पहले सेवा शुरू करने के लिए सुनिश्चित करने के लिए आपको एक और तरीका अपनाने की जरूरत है। आप संदर्भ के लिए वर्तमान पोर्टमैप स्क्रिप्ट देख सकते हैं लेकिन यहां सामान्य दृष्टिकोण है: एक प्रतीक्षा स्क्रिप्ट बनाएं।

परिदृश्य: आप चाहते हैं कि आपकी सेवा ए हमेशा सेवा-बी, सेवा-सी और सेवा-डी से पहले चले।

समाधान: सेवा ए के लिए प्रतीक्षा स्क्रिप्ट बनाएं "इसे कॉल करें" /etc/init/service-a-wait.conf "

# service-a-wait

start on (starting service-b 
    or starting service-c
    or starting service-d)
stop on (started service-a or stopped service-a)

# We know that we have more than one job that needs to wait for service-a and
# will make use of this service, so we need to instantiate.
instance $JOB

# Needed to make starting the job successful despite being killed
normal exit 2
task

script

    status service-a | grep -q "start/running" && exit 0
    start service-a || true

    # Waiting forever is ok.. upstart will kill this job when
    # the service-a we tried to start above either starts or stops
    while sleep 3600 ; do :; done

end script

सादे अंग्रेजी में इसका क्या मतलब है: जब सेवा बी, सी, या डी सिग्नल जो वे शुरू करना चाहते हैं, तो उन्हें सेवा शुरू होने तक इंतजार करना होगा। सेवा-ए-वेट नौकरी को सेवा-शुरू होने तक चलने के लिए डिज़ाइन किया गया है। एक बार सेवा-ए-वेट से बाहर निकल जाने के बाद, अब सेवाएं b, c और d को ले जाने और चलाने के लिए स्वतंत्र हैं।

यह किसी भी रिवर्स निर्भरता को शुरू करने के प्रयासों से पहले सेवा-ए-अप और चलने का आश्वासन देगा।

नोट: "उदाहरण $ JOB" लाइन इस "प्रारंभ ... या .. या .." परिदृश्य में महत्वपूर्ण है। अन्यथा आप वास्तव में B, C, या D में से जो भी पहले बंद हो, के लिए ब्लॉक कर देंगे।

(तात्कालिकता एक बेहतर व्याख्या के लिए ईमानदारी से हकदार है। अभी के लिए, बस करो;)


3
मुझे यह नहीं मिलता है ... क्या सेवा ए और सेवा बी को शुरू करने के बीच दौड़ की स्थिति को रोकता है? मैं यह नहीं देखता कि ऊपरवाले को कैसे पता चलेगा कि स्क्रिप्ट ने "स्टार्ट सर्विस-ए" पूरी कर ली है ... (
उपस्टार्ट के शोडी

@ मर्क रसेल: क्या इसके बजाय normal exit 2लाइन नहीं होनी चाहिए normal exit 0 2? scriptअनुभाग में पहली पंक्ति काफी स्पष्ट रूप से हो सकती है exit 0
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.