शेल स्क्रिप्ट में बैकग्राउंड जॉब


0

मेरे पास एक शेल स्क्रिप्ट है, जो पृष्ठभूमि में लॉन्च की गई script.shकमांड के साथ है cmd, जो है:

#!/bin/bash

cmd &

यदि मैं एक टर्मिनल एमुलेटर खोलता हूं (मैंने xfce4- टर्मिनल और गनोम-टर्मिनल की कोशिश की है) और script.shभीतर चल रहा है, तो मेरी कमांड cmdको प्रभावी ढंग से निष्पादित किया गया है, और पृष्ठभूमि में निष्पादित किया गया है, जैसा कि अपेक्षित था।

लेकिन, अगर मैं पिछले एक से एक टर्मिनल एमुलेटर खोलता हूं (या मेरे डेस्कटॉप सत्र की शुरुआत में, जो मेरा वास्तविक उपयोग मामला है), और मेरी स्क्रिप्ट निष्पादित करें

xfce4-terminal -H -x script.sh (or gnome-terminal -x script.sh)

कमांड cmdअब निष्पादित नहीं है।

मैंने पाया कि मैं इसे set -mअपनी स्क्रिप्ट में डालकर इसे लागू करने के लिए बाध्य कर सकता हूं, लेकिन मुझे समझ नहीं आता कि इस मामले में यह आवश्यक क्यों है (न ही पर्याप्त, वास्तव में), और पिछले एक में नहीं। वास्तव में, अगर मैं set -oअपनी स्क्रिप्ट में एक डाल देता हूं, तो मैं दोनों मामलों में एक ही आउटपुट प्राप्त करता हूं।

क्या कोई मुझे यह समझा सकता है, और / या मुझे शेल स्क्रिप्ट में पृष्ठभूमि नौकरियों के साथ आगे बढ़ने का सही तरीका बता सकता है? धन्यवाद!


संपादित करें: वास्तव में, cmdदोनों मामलों में निष्पादित किया जाता है, लेकिन दूसरे में, इसे तुरंत समाप्त कर दिया जाता है script.sh। इसे रोकने के लिए, कोई भी उपयोग कर सकता है nohup, लेकिन यह पर्याप्त नहीं है, और यह मेरे लिए सबसे अजीब बात है: एक को भी डाल देना है sleep 1, या ऐसा कुछ है, जो प्रक्रिया को पृष्ठभूमि में ठीक से लॉन्च करने की अनुमति देता है, और माता-पिता के खोल से अलग हो जाता है, अन्यथा यह भी मारा जाता है।

मैं वास्तव में दो गोले के बीच व्यवहार में इस अंतर को नहीं समझता हूं, क्योंकि दोनों गैर-संवादात्मक हैं, जैसा कि पिछली टिप्पणी में कहा गया है।


आप कैसे सुनिश्चित कर रहे हैं कि cmdअमल नहीं हो रहा है? क्या यह आसानी से और विशिष्ट रूप से पीएस के आउटपुट में पाया जाता है (और इसे खोजने के लिए लंबे समय तक रहता है), या क्या यह ध्वनि या अन्य जीयूआई संकेत करता है?
5:20 पर Xen2050

@ Xen2050 आमतौर पर, मैं एक cmdऐसी चीज का चयन करता हूं, जिसे किसी कार्य प्रबंधक में देखा जा सकता है, जैसे sleep nकि nकाफी बड़े। लेकिन कोई GUI के साथ कुछ चुन सकता है, जैसे firefoxया कुछ और।
ग्लिफ़

जवाबों:


1

यदि आप खोलते हैं xfce4-trminalया gnome-terminal(या अन्य टर्मिनल) आपका शेल इंटरैक्टिव मोड में है। हर स्क्रिप्ट इंटरैक्टिव मोड में चलाया जाता है।

यदि आप के script.shमाध्यम से चलाते हैं

xfce4-terminal -H -x script.sh

या

gnome-terminal -x script.sh

या अन्य टर्मिनल, आपका शेल गैर-इंटरैक्टिव मोड में है।

लिपियों को -iविकल्प के साथ या #!/bin/bash -iहेडर के साथ इंटरैक्टिव मोड में चलाने के लिए मजबूर किया जा सकता है । ध्यान रखें कि यह गलत स्क्रिप्ट व्यवहार का कारण बन सकता है या कोई त्रुटि मौजूद होने पर भी त्रुटि संदेश दिखा सकता है।

क्या है set -m? यह मॉनिटर मोड है । पृष्ठभूमि प्रक्रियाएं एक अलग प्रक्रिया समूह में चलती हैं और उनके पूरा होने पर बाहर निकलने की स्थिति वाली एक पंक्ति मुद्रित होती है। यह इंटरैक्टिव गोले के लिए डिफ़ॉल्ट रूप से सक्षम है।

क्या है set -o? यह अनिर्दिष्ट प्रारूप में मानक आउटपुट के विकल्पों की वर्तमान सेटिंग्स को लिखता है।

क्यों set -oकाम करता है?

Too विकल्प को कोर्नशेल से उपयोगकर्ता की जरूरतों को पूरा करने के लिए अपनाया गया था। इसके आम तौर पर अनुकूल इंटरफेस के अलावा, commando को vi कमांड लाइन संपादन मोड प्रदान करने की आवश्यकता होती है, जिसके लिए ऐतिहासिक अभ्यास कोई एकल-अक्षर विकल्प नाम नहीं देता है। (हालांकि इस तरह के पत्र का आविष्कार करना संभव हो सकता है, यह माना गया था कि अन्य संपादन मोड विकसित किए जाएंगे और provideso ऐसे एक्सटेंशन का वर्णन करने के लिए पर्याप्त नाम स्थान प्रदान करता है।)

Reportingo विकल्प स्थिति रिपोर्टिंग के लिए उपयोग किए जाने वाले प्रारूप में ऐतिहासिक कार्यान्वयन असंगत हैं। विकल्प-तर्क के बिना + ओ प्रारूप को विकल्प में पोर्टेबल उपयोग की अनुमति देने के लिए जोड़ा गया था जिसे सहेजा जा सकता है और फिर बाद में उपयोग कर बहाल किया जा सकता है, उदाहरण के लिए, एक डॉट स्क्रिप्ट।

वैसे भी, set -mपसंदीदा तरीका है।


नहीं ... आपके टर्मिनल में शेल इंटरैक्टिव है, लेकिन स्क्रिप्ट को चलाने के लिए जो एक है वह नहीं है। यही कारण है कि मैं, विशेष रूप से, set -oमेरी स्क्रिप्ट में डालकर निरीक्षण करता हूं: दोनों मामलों में, इसका आउटपुट समान है, विशेष रूप से मॉनिटर मोड के बारे में, जो बंद करने के लिए सेट किया गया है (गैर संवादात्मक मोड में डिफ़ॉल्ट)। मैं set -oयह देखने के लिए नहीं लगाता कि यह काम करता है, बल्कि इसका आउटपुट देखने के लिए।
ग्लिफ़

0

इस सवाल का जवाब यूनिक्स स्टेक्सचेंज पर दिया गया है (उत्तर के नीचे अतिरिक्त टिप्पणियां भी देखें)। यह सवाल है कि किसे और कब SITEUP सिग्नल भेजता है। और के लिए एक विकल्प set -m / set +mके आसपास cmd &में script.shहै trap '' HUP / trap - HUP

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