बाश में सस्पेंड कमांड का उपयोग करने का एक व्यावहारिक उदाहरण क्या है?


12

suspendबैश में बिलियन कमांड है। आप स्वाभाविक रूप से इस आदेश का उपयोग कब करेंगे और इसे उपयोगी पाएंगे?


1
शेल खुद को हर बार निलंबित करता है क्योंकि यह एक बच्चे की प्रक्रिया की तलाश करता है, यानी एक कमांड चलाता है जहां कहा जाता है कि कमांड एक बाहरी कार्यक्रम है, जिसमें fork/execसिस्टम कॉल की आवश्यकता होती है
the_velour_fog

1
एक संवादात्मक शेल में यह बच्चे की प्रक्रिया को टर्मिनल का नियंत्रण प्राप्त करने की अनुमति देता है, जबकि मूल शेल में टर्मिनल के साथ बातचीत नहीं होती है, जो गड़बड़ हो जाती है।
the_velour_fog

2
@velour, लेकिन उस प्रभाव के लिए एक अलग कमांड चलाने की आवश्यकता नहीं है?
इलकाचू

@the_velour_fog तकनीकी रूप से, पेरेंट शेल निलंबित नहीं होता है (इसे STOPसिग्नल नहीं मिलता है ) जब यह एक बच्चे की प्रक्रिया की तलाश करता है। मैं आपकी दूसरी टिप्पणी से थोड़ा भ्रमित भी हूँ।
Kusalananda

1
@ कुसलानंद ठीक है, सही wait()मुझे उचित लगता है। मैंने कहा कि शेल खुद को हर बार निलंबित करता है क्योंकि यह एक बच्चे की प्रक्रिया की तलाश करता है । मैंने किसी भी स्टॉप सिग्नल प्राप्त करने के बारे में कुछ नहीं कहा, इससे कोई मतलब नहीं होगा।
the_velour_fog 13

जवाबों:


14

मान लें कि आपके पास GNU screenऔर tmux(और X11, और वर्चुअल कंसोल) दोनों का अभाव है , लेकिन एक लॉगिन शेल और एक अन्य इंटरेक्टिव शेल के बीच स्विच करना चाहते हैं।

आप पहले कंसोल पर लॉगिन करेंगे, और फिर एक नया शेल शुरू करेंगे, अस्थायी रूप से लॉगिन शेल को ब्लॉक करना। वहाँ कुछ काम करने के लिए लॉगिन शेल वापस पाने के लिए, आप करेंगे suspend। फिर आप fgजो कुछ भी वहां थे, उसे जारी रखने के लिए इंटरेक्टिव शेल वापस प्राप्त करेंगे ।

वास्तव में, नौकरी पर नियंत्रण के साथ, लॉगिन शेल कई इंटरेक्टिव शेल को पृष्ठभूमि की नौकरियों के रूप में पेश कर सकता है जिसे आप के साथ स्विच कर सकते हैं fg %1, fg %2आदि, लेकिन लॉगिन शेल पर वापस जाने के लिए, आपको suspendतब तक उपयोग करने की आवश्यकता होगी जब तक आप मैन्युअल रूप से नहीं चाहते kill -s STOP $$

यह भी ध्यान दें कि एक इंटरेक्टिव शेल में प्रॉम्प्ट Ctrl+ Zइसे स्थगित नहीं करेगा।

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


के साथ हटाए गए अनुभाग को suspendहटा दिया गया kill -s STOP $$(यह वास्तव में किसी भी अधिक उत्तर का नहीं है, लेकिन यह दूसरों के लिए दिलचस्प हो सकता है):

मान लीजिए कि आपके पास एक स्क्रिप्ट में एक पृष्ठभूमि प्रक्रिया (एक स्क्रिप्ट) है, और यह कि कुछ स्तर पर इस पृष्ठभूमि प्रक्रिया को रोकने की जरूरत है और मूल प्रक्रिया के लिए प्रतीक्षा करने के लिए इसे आगे बढ़ने के लिए कहें। यह इसलिए हो सकता है कि माता-पिता के पास फ़ाइलों को निकालने और स्थानांतरित करने का समय हो या ऐसा कुछ हो।

चाइल्ड स्क्रिप्ट सस्पेंड ( kill -s STOP $$) होगी, और पेरेंट स्क्रिप्ट CONTइसे तब सिग्नल देगी जब इसे जारी रखना ठीक होगा।

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

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