जब तक वे समाप्त नहीं हो जाते तब तक कुछ कमांड टर्मिनल को 'लटका' क्यों देते हैं?


22

कभी-कभी आप टर्मिनल से एक कार्यक्रम चलाने के लिए, कहते हैं, lxpanel । टर्मिनल आपको शीघ्र वापस नहीं लौटाएगा, यह लटकाएगा। आप प्रॉम्प्ट पर वापस जाने के लिए Ctrl+ दबा सकते हैं C, लेकिन यह मार डालेगा lxpanel। हालाँकि, दबाने Alt+ F2(जो एक कमांड लेने के लिए एक विंडो को पॉप अप lxpanelकरता है ) और इनायत से काम करता है।

ऐसा क्यों है? टर्मिनल से कमांड चलाने और 'रन' विंडो से अलग क्या है जो प्रेस करते समय दिखाई देता है Alt+ F2?

यहाँ lxpanel सिर्फ एक उदाहरण के रूप में इस्तेमाल किया गया था। मैंने कई कार्यक्रमों के साथ इसका अनुभव किया है


1
युक्ति: GNU स्क्रीन ( screen), अन्य चीजों के अलावा, लंबी चलने वाली प्रक्रियाओं को "लपेटने" के लिए उपयोग किया जा सकता है। आप इसे अलग कर सकते हैं, शेल पर वापस जा रहे हैं, फिर रीटचैच और रनिंग प्रक्रिया से आउटपुट देख सकते हैं। Reattachment को दूसरे टर्मिनल, SSH आदि से भी किया जा सकता है। ऐसे अन्य कार्यक्रम भी हो सकते हैं, जो आपको इस प्रकार का काम करने दें।
poplitea

जवाबों:


28

डिफ़ॉल्ट रूप से टर्मिनल प्रोग्राम को अग्रभूमि में चलाएगा, इसलिए जब तक कि प्रोग्राम समाप्त नहीं हो जाता है, तब तक आप शेल पर वापस समाप्त नहीं होंगे। यह उन कार्यक्रमों के लिए उपयोगी है जो स्टडिन से पढ़ते हैं और / या स्टडआउट को लिखते हैं - आप आमतौर पर उनमें से कई को एक बार में नहीं चलाना चाहते हैं। यदि आप पृष्ठभूमि में चलने के लिए कोई प्रोग्राम चाहते हैं, तो आप इसे इस तरह से शुरू कर सकते हैं:

$ lxpanel &

या अगर यह पहले से ही चल रहा है, तो आप इसे Ctrl+ के साथ निलंबित कर सकते हैं Zऔर फिर bgइसे पृष्ठभूमि में स्थानांतरित करने के लिए चला सकते हैं। किसी भी तरह से आप एक नए शेल प्रॉम्प्ट के साथ समाप्त हो जाएंगे, लेकिन कार्यक्रम अभी भी चल रहा है और इसका आउटपुट टर्मिनल में दिखाई देगा (इसलिए टाइपिंग के बीच में यह अचानक दिखाई दे सकता है)

कुछ प्रोग्राम (आमतौर पर डेमन) एक अलग प्रक्रिया शुरू करते हैं, और फिर मुख्य प्रक्रिया को तुरंत बाहर निकलने देते हैं। यह आपके शेल को अवरुद्ध किए बिना प्रोग्राम को चालू रखने देता है


तो जब आप Alt + f2 दबाकर प्रोग्राम को 'रन' विंडो के माध्यम से चलाते हैं तो वास्तव में क्या सिस्टम होता है? (कम से कम सूक्ति और ओपनबॉक्स पर, alt + f2 वह करता है)। मैं पूछता हूं क्योंकि जैसे ही आप कमांड टाइप करते हैं, प्रोग्राम शुरू होता है और बॉक्स चला जाता है। क्या यह सिर्फ इसमें a और जोड़ रहा है?
वर्गम

2
@lyrae: डिफ़ॉल्ट रूप से, शेल शेल सत्र जारी रखने से पहले प्रोग्राम के पूरा होने का इंतजार करता है, यह "हैंग" नहीं करता है, "हैंग" की किसी भी परिभाषा से; alt + f2 कार्यक्रम की प्रतीक्षा नहीं करता है। शेल प्रोग्राम के पूरा होने का इंतजार करता है, क्योंकि शेल उपयोगकर्ता के प्रोग्राम इनपुट के मानक इनपुट और / या प्रोग्राम के मानक आउटपुट में जो कुछ भी टाइप करता है उसे रीडायरेक्ट कर सकता है। चूंकि alt + f2 मुख्य रूप से GUI प्रोग्राम शुरू करने के लिए उपयोग किया जाता है, alt + f2 मानक इनपुट / आउटपुट का उपयोग करने की संभावना प्रदान नहीं करता है और इसलिए इसे प्रतीक्षा करने की आवश्यकता नहीं है।
लेयन रयान

1
@lyrae: alt + f2 बैकग्राउंड में प्रोग्राम शुरू करने के लिए कुछ विशेष नहीं करता है; यह वह शेल है जो कुछ विशेष कर रहा है, 'और' खोल की कार्यक्षमता है। जब 'और' के बिना कमांड शुरू करते हैं , तो शेल प्रोग्राम के स्टैंडर्ड इनपुट को अपने स्टैंडर्ड इनपुट और प्रोग्राम के स्टैंडर्ड आउटपुट को अपने स्टैंडर्ड आउटपुट पर रीडायरेक्ट करता है (थोड़ा विरोधाभास, क्योंकि शेल कई अन्य सेवाएं भी प्रदान करता है, जैसे इंटरसेप्ट Ctrl -C, अग्रभूमि कार्यक्रम के लिए एक संकेत संकेत कमांड भेजने के लिए)। 'और' शेल को बताता है कि वे ऐसा नहीं करते हैं और बस कार्यक्रम शुरू करते हैं (भी इससे वंचित हैं)।
रेयान

1
@ लियरन जो आप कह रहे हैं, वह वास्तव में कर्नेल के टर्मिनल ड्राइवर द्वारा संभाला गया है, और "बिना &" के "आमतौर पर" से अधिक "विशेष" है, इसके अलावा शेल कॉल प्रतीक्षा () [या वेटपिड या समकक्ष] जो alt-f2 द्वारा नहीं किया गया है।
रैंडम 832

6

जब आप किसी टर्मिनल में प्रोग्राम शुरू करते हैं, तो टर्मिनल तब तक "हैंग" होगा, जब तक आपका प्रोग्राम बंद नहीं हो जाता। Ctrl+ दबाकर cआप अपने कार्यक्रम को बंद कर रहे हैं, और इस तरह शीघ्र वापस जाना है। उदाहरण के लिए, आप सभी GUI ऐप्स के साथ यह देखेंगे, फ़ायरफ़ॉक्स आज़माएँ।

जब आप किसी अन्य विधि जैसे कि Alt + F2 का उपयोग करते हैं या मेनू के माध्यम से क्लिक करते हैं, तो आपका प्रोग्राम पृष्ठभूमि में शुरू होता है इसलिए कुछ भी अजीब नहीं होता है (और वैसे भी कमांड प्रॉम्प्ट नहीं है)।

यदि आप अभी भी टर्मिनल से GUI ऐप लॉन्च करना चाहते हैं &, तो अपनी कमांड के अंत में संलग्न करें, जैसे

lxpanel &

यह टर्मिनल को lxpanelबैकग्राउंड में चलने के लिए कहता है और आपको तुरंत एक और प्रॉम्प्ट देता है।


3

डिफ़ॉल्ट रूप से उस शेल के अग्रभूमि में एक शेल रन के माध्यम से प्रोग्राम चलते हैं। यह शेल को टर्मिनल से प्रोग्राम तक संचालन और प्रत्यक्ष स्टडिन / स्टडआउट / स्ट्रेट को निलंबित करने का कारण बनता है। डेस्कटॉप वातावरण के माध्यम से चलाए जाने वाले कार्यक्रमों को कांटा जाता है , जो उन्हें चलाने वाले कार्यक्रम से स्वतंत्र चलाने का कारण बनता है। इसे &कमांड में संलग्न करके अधिकांश गोले में सिम्युलेट किया जा सकता है , हालांकि यह अभी भी std * को टर्मिनल से जोड़ेगा (हालांकि एक पृष्ठभूमि वाले प्रोग्राम पर स्टड से पढ़ने से आगे की जटिलताएं हैं)।


2

बाद में कंसोल इंटरेक्शन की आवश्यकता वाले कार्यक्रमों को छोड़कर पृष्ठभूमि के लिए अच्छी तरह से (उदाहरण के लिए, एक "उपयुक्त अद्यतन और" जो अंततः STOP राज्य में प्रवेश करता है क्योंकि यह उपयोगकर्ता को "वास्तव में बल" का संकेत देना चाहता है? .... जब कोई नहीं देख रहा है)।

उस छेद को प्लग करने के लिए और इस प्रक्रिया को सूचित करने के लिए कि एक टर्मिनल वास्तव में कभी भी इसके लिए उपलब्ध नहीं होगा, मैं अपने कुछ आदेशों के लिए एक <& - संलग्न करता हूं, उन्हें सक्रिय टर्मिनल से पूरी तरह से अलग करके बता रहा है कि STDIN अब संभव नहीं है। सुनिश्चित करें कि बिन / बैश आपका शेल है यदि आप इसका उपयोग करते हैं, हालांकि। पटकथा में कोई भी छद्म शब्द उपलब्ध नहीं होने से संबंधित किसी भी त्रुटि को लॉग ऑन किया जाएगा, जिस पर कोई भी संकेत दिया जा सके।

उदाहरण के लिए:

`./runme.sh &> runme.log <&- & disown`

वर्तमान टर्मिनल सत्र से अलग करने का मेरा अंतिम तरीका है। STDOUT और STDERR दोनों runme.log में लॉग इन हो जाते हैं, इससे कोई फर्क नहीं पड़ता कि आपका कंसोल या शेल कितनी जल्दी समाप्त हो जाता है या यदि आप लॉगआउट / su एक अलग खाते में (रनमी से कोई टर्मिनल कचरा नहीं), और यहां तक ​​कि माता-पिता के बच्चे को भंग करने के लिए धन्यवाद पीआईडी ​​संबंध हटा दिया जाता है।

अद्यतन: यहां तक ​​कि इसके साथ मुझे मूल माता-पिता के नाम के साथ जोड़ते हुए एक अर्ध-समस्या से परेशानी हुई है, इसलिए अब मैं इसके बजाय सलाह देता हूं:

at now <<< "(cmd1; cmd2; etc.) &> logfile.log"

यदि आप CRON से आउटपुट ईमेल करना चाहते हैं, या इसे किसी फ़ाइल के बजाय / dev / null पर रीडायरेक्ट करना चाहते हैं, तो निश्चित रूप से &> को हटा दें।


यह हासिल करने के लिए कि मैंने जो प्रयोग शुरू किया था, वह थोड़ा कम जटिल हैat now <<< "(cmd1; cmd2; etc.) &> logfile.log"
मार्कोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.