रनरेट कस्टम स्टॉप स्क्रिप्ट कैसे लिखें


12

मैं एक कस्टम "स्टॉप" स्क्रिप्ट runit( runsv) को निष्पादित करना चाहता हूं जब प्रक्रिया को रोकना / पुनः आरंभ करना हो। वर्तमान में यह केवल प्रक्रिया को मारता है, फिर "फिनिश" स्क्रिप्ट चलाता है। लेकिन मेरे मामले में, मेरी प्रक्रिया गतिशील रूप से बाल प्रक्रियाओं को जन्म देती है, इसलिए सरल के बजाय kill, मुझे "killtree"उनसे छुटकारा पाने की आवश्यकता है। मैं उसको कैसे करू?

मुझे पता है कि यह controlरनिट के विकल्पों के माध्यम से किया जाना चाहिए, लेकिन डॉक्स पढ़ने से यह वास्तव में मेरे लिए स्पष्ट नहीं है कि स्टॉप स्क्रिप्ट का नाम कैसे रखा जाना चाहिए :(

http://smarden.org/runit/runsv.8.html


आपकी सेवा (स्क्रिप्ट नहीं बल्कि कार्यक्रम) गलत व्यवहार की आवाज़ लगती है, इसे अपने बच्चों के बाद फिर से काटना / साफ करना चाहिए। बस जिज्ञासु, यह क्या है?
एवरी पायने

जवाबों:


13

डॉक्स से

नियंत्रण पाइप के लिए भेजे गए प्रत्येक नियंत्रण चरित्र c के लिए, रनवे पहले जांचता है कि सेवा / नियंत्रण / c मौजूद है और निष्पादन योग्य है या नहीं। यदि हां, तो यह सेवा / नियंत्रण / सी शुरू करता है और कमांड की व्याख्या करने से पहले इसे समाप्त करने के लिए इंतजार करता है। यदि प्रोग्राम रिटर्न कोड 0 से बाहर निकलता है, तो आरएसवी सेवा को संबंधित सिग्नल भेजने से रोकता है। कमांड ओ को हमेशा कमांड यू माना जाता है। कमांड d पर पहले सर्विस / कंट्रोल / टी चेक की जाती है, और फिर सर्विस / कंट्रोल / डी। आदेश पर x पहले सेवा / नियंत्रण / टी की जाँच की जाती है, और फिर सेवा / नियंत्रण / x। वैकल्पिक लॉग सेवा का नियंत्रण अनुकूलित नहीं किया जा सकता है।

इसका मतलब है कि आपको एक service_name/control/Xएक्स बनाने की आवश्यकता है , एक्स एक निष्पादन योग्य है जो आपको संबंधित svकमांड को सेवा में भेज देगा , जैसे dकमांड (डाउन)। यदि आपकी स्क्रिप्ट स्थिति 0 से बाहर निकलती है, तो यह सेवा को स्वयं नीचे करने का प्रयास नहीं करेगी।

मूल रूप से आपको /etc/sv/<service>/control/dउस पर एक निष्पादन योग्य स्क्रिप्ट की आवश्यकता होती है जो आप चाहते हैं और सेवा को मार डालेंगे, साफ कर सकते हैं और pids आदि।


यह वास्तव में दिलचस्प और सरल है जिस तरह से रनवीर काम करता है।
डज़ुंग गुयेन

2

इसका सरल उत्तर है कि आप अपनी सफाई स्क्रिप्ट का नाम "सेवा / समापन" रखें। "सेवा / रन" से बाहर निकलने पर यह स्क्रिप्ट निष्पादित होती है।

एक "सेवा / नियंत्रण / ctrl_char इंटरफ़ेस भी है। यह आपको अलग-अलग क्रिया करने की अनुमति देता है, जिसके आधार पर आप आरएसवीएस पर भेजते हैं।


1
TERM CONT को रनिंग सर्विस को भेजे जाने के बाद सर्विस / फिनिश चलती है। यह मारने के बाद सेवा समाशोधन की तरह है।
मैक्सिमकोस्ट्रिंक

2

मुझे इस समस्या का समाधान खुद ही करने वाले के लिए करना था। मेरे पास uwsgi सर्वर चल रहा था, और इसे कंटेनर को रोकने पर docker (T बजाय INT) के द्वारा गलत सिग्नल भेजा गया था।

नियंत्रण / एक्स फ़ाइलों का विचार एक प्राप्त संकेत पर प्रतिक्रिया करना है। मेरे मामले में, मैं tटर्मिनेट सिग्नल के लिए एक फ़ाइल को नियंत्रण में रखूंगा , क्योंकि यह शब्द सिग्नल के लिए आरक्षित है। स्क्रिप्ट निष्पादन योग्य होनी चाहिए।

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

स्क्रिप्ट uwsgi प्रक्रिया के लिए एक अंतर संकेत भेजती है, जो मुझे चाहिए।

यदि नियंत्रण स्क्रिप्ट त्रुटि के बिना बाहर निकल रही है (रिटर्न कोड 0) तो मूल संकेत प्रक्रिया को नहीं भेजा जाएगा।

इसलिए मेरे मामले में मैं टर्म सिग्नल प्राप्त करने में सक्षम था और इसके बजाय सेवा प्रक्रिया के लिए एक अंतर सिग्नल भेज रहा था।

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