शटडाउन हुक बनाने का सबसे अच्छा तरीका?


9

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

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

मुझे लगता है कि मैं इसे एक अपस्टार्ट जॉब द्वारा हल कर सकता हूं जो शटडाउन पर चालू हो जाएगा, लेकिन मैं अनिश्चित हूं कि मुझे किन घटनाओं का उपयोग किस तरीके से करना चाहिए। अब तक, मैंने निम्नलिखित (आंशिक रूप से विरोधाभासी) कथनों को पढ़ा है:

  • अपस्टार्ट में कोई सामान्य शटडाउन इवेंट नहीं है
  • start on starting shutdownनौकरी की परिभाषा में एक छंद का उपयोग करें
  • start on runlevel [06S]नौकरी की परिभाषा में एक छंद का उपयोग करें
  • start on starting runlevel [06S]नौकरी की परिभाषा में एक छंद का उपयोग करें
  • start on stopping runlevel [!06S]नौकरी की परिभाषा में एक छंद का उपयोग करें

इन सिफारिशों से, निम्नलिखित प्रश्न उठते हैं:

  • क्या उबंटू के अपस्टार्ट में कोई सामान्य शटडाउन इवेंट नहीं है?
  • "शटडाउन हुक" को लागू करने के लिए अनुशंसित तरीका क्या है?
  • जब इवेंट रनलेवल [x] ट्रिगर हो जाते हैं; यह रनवेल में प्रवेश करते समय या रनवे में प्रवेश करते समय होता है?
  • क्या हम कुछ ऐसा उपयोग कर सकते हैं start on starting runlevel [x]या start on stopping runlevel [x]?
  • मेरी समस्या का सबसे अच्छा समाधान क्या होगा?

आपका बहुत बहुत धन्यवाद

जवाबों:


2

startingऔर runlevelअलग-अलग कार्यक्रम हैं, इसलिए आप सार्थक रूप से नहीं कह सकते starting runlevel N

runlevel Nघटना रनलेवल में प्रवेश के शुरू में उत्सर्जित होता है। यदि आप start on runlevel Nतब अपना कार्य प्रवेश पर चलाते हैं। रनलेवल में प्रवेश करने पर चलने का तरीका पूरा हो गया है run on started rc RUNLEVEL=N

जैसा कि मैंने इसे समझा है, आपको वह start on runlevel [06S]करने की ज़रूरत है जो आप चाहते हैं; इससे पहले कि यह बंद हो जाए, सिद्धांत में चलना चाहिए। बेहतर नियंत्रण के लिए आप इसका उपयोग कर सकते हैं start on stopping apache or stopping mysql or ...ताकि आपका कार्य चलने से पहले ही उन्हें बंद कर दिया जाए।


रनलेवल 5 से एस को बदलने के लिए संपादित


1
इसके अलावा, केवल एक प्रतिष्ठित startupघटना यह है कि "पंप को प्राइम" करने के लिए कुछ आवश्यक है। उसके बाद एक विशेषाधिकार प्राप्त घटना भेजी जाती है, बाकी सब कुछ हो सकता है, और इसके द्वारा शुरू किए गए कार्यों और कार्यों द्वारा परिभाषित किया जाता है startup। जहाँ तक किसी एक shutdownघटना के न होने की बात है , उसके shutdownसार्थक होने के लिए बहुत सारे प्रकार हैं। उन नौकरियों पर सीधे निर्भर रहना बेहतर है जो आपको चलाने की आवश्यकता है।
गाइकोसॉर

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

(लगभग सब कुछ जो चल रहा है), और मैं बॉक्स पर चलने वाली प्रक्रियाओं (ps-alf) और इन प्रक्रियाओं को नियंत्रित करने वाली नौकरियों के बीच संबंध का पता लगाने की सोचने की भी हिम्मत नहीं करता; यह सुनिश्चित करने के लिए कि कोई 1: 1 संबंध नहीं है। ऐसी नौकरियां हैं जो किसी भी प्रक्रिया से संबंधित नहीं हैं (उदाहरण के लिए नेटवर्क को कॉन्फ़िगर करना), और मुझे लगता है कि पर्याप्त प्रक्रियाएं हैं जो नौकरियों से संबंधित नहीं हैं और विशेष रूप से मैन्युअल रूप से चीजें शुरू करते समय।
ओली

अपस्टार्ट ने हार्डकोडेड रनवेल्स को बदल दिया ; जहां तक ​​मैं निर्धारित कर सकता हूं, रनवे की अवधारणा दूर नहीं जा रही है, यह अब केवल उपयोगकर्ताओं में परिभाषित किया गया है। यदि आप इतने लंबे समय से चिंतित हैं, तो आप on stopping servicea or stoping serviceb or ...जो कुछ भी सेवाओं को चलाने की आवश्यकता है , उसके लिए मेरे अंतिम सुझाव का उपयोग करना चाहते हैं ।
गीकॉर्पोस

-1 कई अशुद्धियों के लिए। बाहर फ्लैट, यह वास्तव में काम नहीं करेगा। आरसी RUNLEVEL = [016] पर रुकना कोई अलग फ्रंन नहीं है 'रनलेवल पर रोक [016]'। ऐसा इसलिए है क्योंकि न तो घटना बंद को आगे बढ़ने से रोक देगी। अमान्य सिंटैक्स भी है, क्योंकि 'रन ऑन' मान्य नहीं है। इस सब में बस इस मुद्दे को भ्रमित करता है, यह वास्तव में मदद नहीं करता है। क्षमा करें कि यह बहुत देर हो चुकी है! बस पुराने उत्तरों की समीक्षा कर रहा हूं।
SpamapS

2

जब आपकी नौकरी बंद हो जाएगी, तो आगे बढ़ने से रोकने के लिए, आप इसका उपयोग करना चाहेंगे:

stop on starting rc RUNLEVEL=[016]

यह काम करेगा क्योंकि पहली बार जब आप 'शटडाउन' टाइप करते हैं तो ट्यूनवेल 0 उत्सर्जित होता है। आरसी रनलेवल पर शुरू होता है, और रोक से संक्रमण -> शुरू होने से पूरी तरह से अवरुद्ध हो जाएगा जब तक कि किसी भी नौकरी को भी बदलना होगा जो राज्य को पूरा करती है।

आप यह सुनिश्चित करना चाहते हैं कि आपकी प्रक्रिया SIGTERM को तुरंत प्रतिक्रिया दे। यदि यह 5 सेकंड के भीतर जवाब नहीं देता है, तो upstart इसे SIGKILL भेजेगा। आप इसे 'किल टाइमआउट एक्स' के साथ उठा सकते हैं।

वहाँ 1 में, btw थोड़ा मुश्किल है, आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी शुरुआत में कुछ ऐसा शामिल हो जो उस समय रनलेवल [2345] पर शुरू होता है, ताकि एकल उपयोगकर्ता मोड रखरखाव के लिए नीचे जा रहे उपयोगकर्ता को अपना काम फिर से शुरू हो जाए। सौभाग्य से काम का एक बहुत कुछ यह सामान्य रूप से शुरू सुझाव दिया है बनाने में चला गया है

start on runlevel [2345]

इसके अलावा कुछ मामलों में नेटवर्क को नीचे लाने तक आपको कुछ चालू रखने की आवश्यकता होती है (जैसे कि dbus / नेटवर्क-प्रबंधक)। उसके लिए आपको चाहिए

stop on deconfiguring-networking

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


क्या आपका मतलब start on starting ... यह है कि मेरे शटडाउन हुक को किसी भी चीज़ पर रोकना बहुत मायने नहीं रखता। start on starting rc RUNLEVEL=[016]बहुत अधिक समझ में आता है। और हो सकता है taskकि अन्य चीजों को चलाने से पहले इसे पूरा करने के लिए वहाँ फेंक दिया जाए।
तीजय कार्डन

0

Geekosaur, आपकी मदद के लिए बहुत बहुत धन्यवाद।

इस बीच, मैंने start on runlevel [016]विधि की कोशिश की है, लेकिन यह काम नहीं किया, और मुझे लगता है कि मैं समझता हूं कि क्यों:

नौकरी वास्तव में शुरू कर दी गई है, लेकिन नौकरी के कार्य समाप्त होने तक शटडाउन प्रक्रिया को अवरुद्ध नहीं किया गया है। मुझे अब पूरा यकीन है कि ईवेंट्स startingऔर stoppingइकलौते इवेंट्स हैं, जिनका इस्तेमाल जॉब की परिभाषा में अन्य जॉब को ब्लॉक करने के लिए किया जा सकता है, और मुझे लगता है कि यह वही है जो अपस्टार्ट के मैनुअल हमें बताने की कोशिश करते हैं। इसलिए, रनलेवल इवेंट का उपयोग करने से कभी भी अन्य नौकरियों या शटडाउन प्रक्रिया को अवरुद्ध नहीं किया जाएगा; इस प्रकार, यह मेरे उद्देश्य के लिए बेकार है।

इसके बजाय, मुझे लगता है कि दो संभावनाएँ हैं:

  1. आपके किसी प्रस्ताव के बाद, उन सभी नौकरियों का पता लगाएं, जिनकी जासूसी के लिए आवेदन की आवश्यकता होती है, और उन सभी को स्क्रिप्ट की शुरुआत की घटना में शामिल करें जैसे:

    start on stopping job1 or stopping job2 or ...
    

    यह इतना काम है कि मैं गंभीरता से नौकरी की सूची को डंप करने और इसे सेड के माध्यम से चलाने के बारे में सोच रहा हूं ताकि मेरी नौकरी के लिए स्वचालित रूप से एक शुरुआत श्लोक तैयार किया जा सके जिसमें सभी नौकरियां शामिल हैं जो सामान्य रूप से सिस्टम पर चल रही हैं।

    इसका फायदा यह होगा कि संबंधित एप्लिकेशन तब भी बंद हो जाएंगे जब कोई व्यक्ति किसी एक शर्त को मैन्युअल रूप से रोकता है (जैसा कि रनलेवल बदलाव / शटडाउन / रिबूट द्वारा उन्हें रोकने के लिए)।

  2. उस एक नौकरी को खोजें, जो सिस्टम को रिबूट करने / बंद करने पर सबसे पहले बंद हो जाएगी (चलो इस नौकरी को "फर्स्टजोब" कहते हैं) और उस नौकरी का उपयोग इस तरह करें:

    start on stopping FirstJob
    

    मुख्य नुकसान यह होगा कि मुझे नहीं पता कि ऐसी नौकरी मौजूद है या नहीं और अगर वह नौकरी वास्तव में अन्य सभी नौकरियों पर निर्भर करती है, जो कि वास्तव में उस पर लागू होता है, जो इस मामले में "निर्भर करता है" (दूसरी नौकरी पर निर्भर करता है)। पूरी तरह से अन्य काम बंद होने से पहले ")।

मुझे यकीन नहीं है कि दोनों में से कौन सी संभावना बेहतर है ...


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