SSH- पृष्ठभूमि प्रक्रियाओं के लिए प्रतीक्षा क्यों नहीं करता है?


13

ऐसा क्यों है कि ssh -tपृष्ठभूमि की नौकरियों के खत्म होने का इंतजार नहीं किया जाता है?

उदाहरण:

ssh user@example 'sleep 2 &'

यह उम्मीद के मुताबिक काम करता है, क्योंकि ssh 2 सेकंड के बाद लौटता है, जबकि

ssh user@example -t 'sleep 2 &'

sleepखत्म होने का इंतजार नहीं करता और तुरंत लौट आता है।

क्या कोई इसके पीछे का कारण बता सकता है? क्या ssh -tवापसी करने से पहले सभी पृष्ठभूमि प्रक्रियाओं की प्रतीक्षा करने का एक तरीका है ?

मेरा उपयोग मामला यह है कि मैं एक स्क्रिप्ट शुरू करता हूं ssh -t, और यह स्क्रिप्ट कई पृष्ठभूमि वाली नौकरियां शुरू करती है, जिन्हें मुख्य स्क्रिप्ट के खत्म होने के बाद जीवित रहना चाहिए। इसके साथ ssh -tअब तक संभव नहीं है।

जवाबों:


22

इसके बिना -t, sshdदूरस्थ शेल (और बच्चों को पसंद है sleep) और दो पाइप के माध्यम से stderr (और एक अन्य पाइप के माध्यम से ग्राहक के इनपुट भी भेजता है) का स्टडआउट प्राप्त करता है।

sshd उस प्रक्रिया के लिए प्रतीक्षा करता है जिसमें उसने उपयोगकर्ता के लॉगिन शेल को शुरू किया है, लेकिन इसके बाद भी, उस प्रक्रिया ने stdout पाइप पर eof के लिए प्रतीक्षा समाप्त कर दी है (कम से कम ओपनश के मामले में stderr पाइप नहीं)।

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

जब आप उपयोग करते हैं -t, sshdतो पाइप का उपयोग नहीं करते हैं। इसके बजाय, दूरस्थ शेल और उसके बच्चों के साथ सभी इंटरैक्शन (स्टडिन, स्टडआउट, स्टेडर) एक छद्म टर्मिनल जोड़ी का उपयोग करके किया जाता है।

एक छद्म टर्मिनल जोड़ी sshdके साथ, मास्टर पक्ष के साथ बातचीत करने के लिए, कोई समान ईओफ़ हैंडलिंग या यह जानने का कोई तरीका नहीं है कि क्या छद्म टर्मिनल के दास पक्ष के लिए खुले fds के साथ अभी भी प्रक्रियाएं हैं, इसलिए यह केवल समाप्ति की प्रतीक्षा करता है वह प्रक्रिया जिसमें यह दूरस्थ उपयोगकर्ता के लॉगिन शेल को निष्पादित करता है और फिर बाहर निकलता है।

उस निकास पर, मटर जोड़ी के मास्टर पक्ष को बंद कर दिया जाता है जिसका अर्थ है कि नाशपाती नष्ट हो गई है, इसलिए दास द्वारा नियंत्रित प्रक्रियाओं को एक S नाईटअप (जो डिफ़ॉल्ट रूप से उन्हें समाप्त करेगा) प्राप्त होगा।


1
पूरी तरह से उत्तर के लिए धन्यवाद! एक और बात मैं जानना चाहूंगा: क्या छद्म टर्मिनल से बाहर निकलते ही सभी पृष्ठभूमि प्रक्रियाएं समाप्त हो जाती हैं? स्क्रिप्ट मैं शुरू कर रहा हूँ एक सेवा शुरू होती है, जो ssh के साथ अच्छी तरह से काम करती है। लेकिन ssh -t का उपयोग करते समय, सेवा शुरू नहीं की जाती है। ऐसा लगता है कि ssh के वापस आने पर सेवा बंद हो जाती है।
फिलिप मुरी

दरअसल, एक छद्म टर्मिनल के मास्टर पक्ष के लिए यह जानने का एक तरीका है कि सभी दास फ़ाइल विवरणकों को कब बंद किया गया है। वास्तविक टर्मिनल द्वारा ट्रिगर किया गया यह एक ही तंत्र है जब सभी फाइल डिस्क्रिप्टर को बंद कर दिया गया है, वास्तव में।
JDBP


@JdeBP, क्या आप विस्तार करना पसंद करेंगे? मुझे नहीं पता तुम्हारा क्या मतलब है। AFAICT टर्मिनल एमुलेटर (xterm और गनोम-टर्मिनल कम से कम) प्रक्रियाओं के बारे में परवाह नहीं करते हैं फिर भी दास के लिए खोल दिए गए fds जब प्रक्रिया को वे खोल में मर जाते हैं
स्टीफन चेज़लस

@PhilippMurry का उपयोग आप nohupएक स्क्रिप्ट को चालू रखने के लिए कर सकते हैं । (आप लंबे समय तक चलने वाली नौकरियों को शुरू करने पर विचार tmuxकर सकते हैं ताकि आप उनकी प्रगति पर अंतःक्रियात्मक रूप से निगरानी रख सकें, लेकिन एक लॉग फ़ाइल ठीक काम करती है।)
jpaugh

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