'और' के साथ लिनक्स शेल कमांड क्यों चलाते हैं?


30

मैं Red Hat Linux Enterprise संस्करण 5 का उपयोग कर रहा हूं। मैंने देखा है कि लोग कभी-कभी कुछ &विकल्पों के साथ कमांड चलाते हैं। उदाहरण के लिए, नीचे दिए गए आदेश में, दो &संकेत हैं। इनका उद्देश्य क्या है? क्या वे हमेशा नोह के साथ एक साथ उपयोग किए जाते हैं?

nohup foo.sh <script parameters> >& <log_file_name> &

जवाबों:


15

मार्टिन के, ऐश और केविन के जवाबों के अलावा, कभी-कभी आप एक बिटवाइस और * के लिए गणितीय रूप से इस्तेमाल किया जाने वाला एम्परसैंड देखेंगे :

$ echo $(( 11 & 7 ))
3

मामले में आप बिट ऑपरेटरों से परिचित नहीं हैं:

11: 1011
 7: 0111
-------- AND
 3: 0011

प्रत्येक स्थिति में पहली संख्या में एक बिट है और दूसरी संख्या में, उस बिट को उत्तर में एक सेट करें।

* केविन के जवाब में सुविधा को तार्किक और के रूप में जाना जाता है ।

ऐश के जवाब के बारे में विस्तार से बताने के लिए, जब पुनर्निर्देशन में उपयोग किया जाता है तो एम्परसैंड शेल को किसी फाइल डिस्क्रिप्टर की नकल करने के लिए कह सकता है। इस कमांड echo "hello" > outputfile 2>&1में एम्परसैंड किसी भी आउटपुट का कारण बनता है जो मानक त्रुटि (stderr, फ़ाइल डिस्क्रिप्टर 2) पर जा सकता है, मानक आउटपुट (स्टडआउट, फ़ाइल डिस्क्रिप्टर 1, बाईं ओर के लिए डिफ़ॉल्ट) के समान स्थान पर जाने के लिए >>& outputfileऑपरेटर के लिए आशुलिपि है > outputfile 2>&1

इसके अलावा, बाश 4 में नया, caseकमांड में क्लॉज़ के लिए दो नए टर्मिनेटर हैं ;&और ;;&जो प्रभावित करते हैं कि क्या कोई मामला "से गुजरता है" और, यदि हां, तो क्या अगला परीक्षण किया जाता है।


कूल, डेनिस! मान लीजिए कि मैं मशीन में ssh टर्मिनल लॉग का उपयोग करता हूं, तो कमांड निष्पादित करने के लिए ssh के टर्मिनल का उपयोग कर रहा है (मान लीजिए कि एक लंबी-प्रक्रिया चलती है), तो अगर मैंने टर्मिनल सत्र छोड़ दिया, तो कमांड की लंबे समय तक चलने वाली प्रक्रिया सही समाप्त हो जाएगी? और अगर मैं चाहता हूं कि यदि मैं शेल छोड़ता हूं तो भी कमांड निष्पादित करना जारी रखता है, तो क्या मुझे nohup का उपयोग करना चाहिए, या & (कमांड के अंत में) या nohup और & का उपयोग करके?
जॉर्ज 2

1
@ जॉर्ज 2: नहीं, >& filenameएक ही फाइल के लिए stdout और stderr दोनों को आउटपुट करता है। यदि आप stderr को केवल पुनर्निर्देशित करना चाहते हैं (और अकेले stdout छोड़ें) तो आप क्या करेंगे 2> filename। आपके अन्य प्रश्न के लिए, सबसे अधिक संभावना है कि आप दोनों का उपयोग करेंगे nohupऔर &
अगली सूचना तक रोक दिया गया।

1
@ George2: आप पृष्ठभूमि नहीं आदेश तो करते हैं आप एक जारी कर सकते हैं एक सुरक्षा प्रॉम्प्ट कभी वापस नहीं पायेगी logoutया exitआदेश।
अगली सूचना तक रोक दिया गया।

2
जॉर्ज: यदि आप उपयोग नहीं करते हैं, तो आप कभी भी कुछ और करने के लिए अपना संकेत वापस नहीं लेंगे। जब तक प्रक्रिया खत्म नहीं होगी तब तक टर्मिनल "लटका" रहेगा (समाप्त हो जाएगा) या इसे समाप्त / मार दिया जाएगा। & गारंटी देता है कि प्रक्रिया पृष्ठभूमि में चलती है। हालाँकि, यदि आप लॉगऑफ़ करते हैं, तो ऑपरेटिंग सिस्टम आपकी सभी प्रक्रियाओं को समाप्त कर देगा, जो आपकी पृष्ठभूमि प्रक्रिया को भी मारता है। यदि आप nohup का उपयोग करते हैं तो आप इस प्रक्रिया को "कमांड को अनदेखा करें जो आपको समाप्त कर देगा"।
मार्टिन मार्कोसिनी

1
@ जॉर्ज 2: हाँ। "हैंगअप के लिए प्रतिरक्षा" == "प्रक्रिया जारी है" और "नॉन-ट्टी" == "टर्मिनल कंसोल सेशन को छोड़ दें"
आगे की सूचना तक रोक दिया गया।

32

बैश शेल स्क्रिप्ट में, एम्परसेंड "और" का उपयोग कांटा प्रक्रियाओं के लिए किया जाता है:

find -name hello &

यह पृष्ठभूमि में फोर्क होने और चलने की कमांड का कारण बनेगा (आप इसे हमेशा अपने पीआईडी ​​द्वारा मार सकते हैं)।


धन्यवाद मार्टिन, मान लीजिए कि मैं एक मशीन में ssh टर्मिनल लॉग का उपयोग करता हूं, तो ssh के टर्मिनल का उपयोग कमांड को निष्पादित करने के लिए करता है (एक लंबे समय तक चलने वाली प्रक्रिया को मान लेता है), तो अगर मैंने टर्मिनल सत्र को छोड़ दिया, तो कमांड की लंबे समय तक चलने वाली प्रक्रिया को समाप्त कर दिया जाएगा। ? और अगर मैं ssh टर्मिनल का उपयोग करके कमांड निष्पादित करता हूं, भले ही मैंने टर्मिनल छोड़ दिया हो, कमांड की लंबी-रन प्रक्रिया अभी भी चल रही है, सही है?
जॉर्ज 2

1
यह सही है जॉर्ज। पृष्ठभूमि की प्रक्रिया तब तक जारी रहनी चाहिए जब तक कि वे बाहर न निकल जाएं या आप उन्हें मार न दें। हालाँकि, जैसा कि यह पहले ही बताया जा चुका है, उपयोगकर्ता को लॉग ऑफ होने पर आपको मरने से बचने के लिए नोह की आवश्यकता होगी।
मार्टिन मार्कोसिनी

धन्यवाद मार्टिन! मैं जानना चाहता हूं कि हमें दोनों और nohup का उपयोग करने की आवश्यकता क्यों है, और उनके व्यक्तिगत कार्य क्या हैं जो हमें टर्मिनल कंसोल के क्विट होने पर भी कमांड को जारी रखने के लक्ष्य को प्राप्त करने में सक्षम बनाते हैं। मैं nohup के लिए मैन पेज पढ़ता हूं, और यह उल्लेख किया जाता है कि "हैंगअप के लिए कमांड इम्यून रन करें, नॉन-ट्टी के आउटपुट के साथ", मुझे भ्रम है कि क्या हैंगअप के लिए इम्यून है, जिसका मतलब है कि आप कमांड को छोड़ने से प्रभावित हुए बिना ही चलते रहना चाहते हैं। टर्मिनल कंसोल? यदि ऐसा है, तो मुझे लगता है कि nohup का उपयोग करना पर्याप्त है, और उपयोग करने की कोई आवश्यकता नहीं है। कोई टिप्पणी?
जॉर्ज 2

1
आपको दोनों का उपयोग करने की आवश्यकता है, यदि आप उपयोग नहीं करते हैं और, टर्मिनल आपको किसी अन्य कमांड में प्रवेश करने की अनुमति नहीं देगा। आपके लिए इसे देखने का सबसे अच्छा तरीका, बस इसे आज़माना है। एक अच्छा उदाहरण एक कमांड है जिसमें कुछ समय लगता है, जैसे: find -name SomeName /> somefile.txt कोशिश करते हैं कि nohup और & के साथ अंतर देखें।
मार्टिन मार्कोसिनी

इस nohup सवाल के लिए एक महान जवाब है: serverfault.com/questions/311593/…
joshperry

26

'और' के साथ लिनक्स शेल कमांड क्यों चलाते हैं?

अपना संकेत तुरंत वापस पाने के लिए, और पृष्ठभूमि में प्रक्रिया को चलाएं।

इनका क्या कार्य है?

nohup पृष्ठभूमि प्रक्रिया को उपयोगकर्ता द्वारा लॉग आउट करने के बाद भी चालू रखने की अनुमति देता है (या आरंभ करने वाले शेल से बाहर निकलता है)।

> और लॉग फ़ाइल में मानक आउटपुट और मानक त्रुटि दोनों को रीडायरेक्ट करता है।

& पृष्ठभूमि में पूरी चीज चलाता है, आपको तुरंत अपना संकेत देता है।

स्पष्टीकरण:

प्रत्येक लिनक्स प्रक्रिया में तीन I / O चैनल, एक इनपुट "स्टडिन", एक मानक आउटपुट "stdout" और एक मानक त्रुटि आउटपुट "stderr" खुलता है। उनका उपयोग बाइनरी के लिए किया जा सकता है, लेकिन वे पारंपरिक रूप से पाठ हैं। जब अधिकांश कार्यक्रम स्टड पास देखते हैं, तो वे बाहर निकल जाते हैं (इसे प्रोग्रामर द्वारा बदला जा सकता है)।

जब माता-पिता खोल बाहर निकलते हैं, तो बच्चों पर स्टड बंद हो जाता है, और (अक्सर, आमतौर पर) बच्चे बाहर निकलते हैं। इसके अलावा, बच्चों को एक सॉफ्टवेयर सिग्नल प्राप्त होता है, SIGHUP, यह दर्शाता है कि उपयोगकर्ता ने "लटका दिया" (पूर्व में, मॉडेम) और यहां डिफ़ॉल्ट भी बाहर निकलने के लिए है। (ध्यान दें, प्रोग्राम लिखते समय एक प्रोग्रामर यह सब बदल सकता है)।

इसलिए, जो कुछ भी नहीं करता है, वह बच्चे को एक अलग I / O वातावरण की प्रक्रिया देता है, जो इन्स को और माता-पिता के कवच से बंधे नहीं होने के लिए बाध्य करता है, और बच्चे को Sightup सिग्नल से बचा लेता है। एक बार जब उपयोगकर्ता डिस्कनेक्ट हो जाता है, तो आप नॉटअप बैकग्राउंड प्रोसेस को इनिट (प्रक्रिया 1) के स्वामित्व में देखेंगे, न कि उपयोगकर्ता के शेल को।

हालाँकि nohupयह प्रक्रिया पूरी तरह से काम नहीं कर सकती है अगर प्रक्रिया अग्रभूमि में चलती है, तो &इसका उपयोग पृष्ठभूमि में प्रोग्राम को चलाने के लिए किया जाता है, जहां यह उपयोगकर्ता के साथ या बिना लॉगिन किए खुशी से रह सकता है।


मान लीजिए कि मैं मशीन में ssh टर्मिनल लॉग का उपयोग करता हूं, तो कमांड निष्पादित करने के लिए ssh के टर्मिनल का उपयोग कर रहा है (मान लीजिए कि एक लंबी-प्रक्रिया चलती है), तो अगर मैंने टर्मिनल सत्र छोड़ दिया, तो कमांड की लंबे समय तक चलने वाली प्रक्रिया सही समाप्त हो जाएगी? और अगर मैं चाहता हूं कि यदि मैं शेल छोड़ता हूं तो भी कमांड निष्पादित करना जारी रखता है, तो क्या मुझे nohup का उपयोग करना चाहिए, या & (कमांड के अंत में) या nohup और & का उपयोग करके?
जॉर्ज 2

1
सही, SSH डिस्कनेक्ट के बाद जारी रखने के लिए nohup और & amp; दोनों का उपयोग करें।
किमी

धन्यवाद Kmarsh! मैं जानना चाहता हूं कि हमें दोनों और nohup का उपयोग करने की आवश्यकता क्यों है, और उनके व्यक्तिगत कार्य क्या हैं जो हमें टर्मिनल कंसोल के क्विट होने पर भी कमांड को जारी रखने के लक्ष्य को प्राप्त करने में सक्षम बनाते हैं। मैं nohup के लिए मैन पेज पढ़ता हूं, और यह उल्लेख किया जाता है कि "हैंगअप के लिए कमांड इम्यून रन करें, नॉन-ट्टी के आउटपुट के साथ", मुझे भ्रम है कि क्या हैंगअप के लिए इम्यून है, जिसका मतलब है कि आप कमांड को छोड़ने से प्रभावित हुए बिना ही चलते रहना चाहते हैं। टर्मिनल कंसोल? यदि ऐसा है, तो मुझे लगता है कि nohup का उपयोग करना पर्याप्त है, और उपयोग करने की कोई आवश्यकता नहीं है। कोई टिप्पणी?
जॉर्ज 2

1
मैं जवाब देने के लिए अपना जवाब संपादित करूंगा।
13

13

@ मार्टिन के जवाब के अलावा: एम्परसेंड ( >&जैसा कि ऊपर) का अन्य उपयोग दोनों पर कब्जा करने के लिए है stdoutऔर stderr। आम तौर पर, यदि आप आउटपुट को केवल '>' वाली फ़ाइल पर पुनर्निर्देशित करते हैं, तो आपको stdoutकिसी भी त्रुटि को याद करते हुए , केवल आउटपुट ही मिलेगा ।


1. धन्यवाद ऐश, मैं आपके साथ यह पुष्टि करना चाहता हूं कि "> और <लॉग फ़ाइल का नाम>", लॉग फ़ाइल में सभी stderr और stdout डंप करेगा, सही? 2. और "> <लॉग फ़ाइल नाम>" का उपयोग करके लॉग फ़ाइल में सभी स्टडआउट डंप करेंगे, सही?
जॉर्ज 2

1
@ जॉर्ज: हाँ, यह सही है।
ऐश

धन्यवाद ऐश! मैं जानना चाहता हूं कि हमें दोनों और nohup का उपयोग करने की आवश्यकता क्यों है, और उनके व्यक्तिगत कार्य क्या हैं जो हमें टर्मिनल कंसोल के क्विट होने पर भी कमांड को जारी रखने के लक्ष्य को प्राप्त करने में सक्षम बनाते हैं। मैं nohup के लिए मैन पेज पढ़ता हूं, और यह उल्लेख किया जाता है कि "हैंगअप के लिए कमांड इम्यून रन करें, नॉन-ट्टी के आउटपुट के साथ", मुझे भ्रम है कि क्या हैंगअप के लिए इम्यून है, जिसका मतलब है कि आप कमांड को छोड़ने से प्रभावित हुए बिना ही चलते रहना चाहते हैं। टर्मिनल कंसोल? यदि ऐसा है, तो मुझे लगता है कि nohup का उपयोग करना पर्याप्त है, और उपयोग करने की कोई आवश्यकता नहीं है। कोई टिप्पणी?
जॉर्ज 2

4

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

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$

कूल, केविन! मान लीजिए कि मैं मशीन में ssh टर्मिनल लॉग का उपयोग करता हूं, तो कमांड निष्पादित करने के लिए ssh के टर्मिनल का उपयोग कर रहा है (मान लीजिए कि एक लंबी-प्रक्रिया चलती है), तो अगर मैंने टर्मिनल सत्र छोड़ दिया, तो कमांड की लंबे समय तक चलने वाली प्रक्रिया सही समाप्त हो जाएगी? और अगर मैं चाहता हूं कि यदि मैं शेल छोड़ता हूं तो भी कमांड निष्पादित करना जारी रखता है, तो क्या मुझे nohup का उपयोग करना चाहिए, या & (कमांड के अंत में) या nohup और & का उपयोग करके?
जॉर्ज 2

या तो कोई काम करेगा। NOHUP इसे करने का मूल तरीका था, मैं कल्पना करता हूं (लेकिन पूरी तरह से अनुमान लगा रहा हूं), लेकिन पृष्ठभूमि अब काम करती है। एक महत्वपूर्ण अंतर तब होता है जब एक रिमोट सिस्टम में sshing द्वारा एक इंटरेक्टिव शेल चला रहा हो। NOHUP प्रक्रिया अग्रभूमि में चलेगी, लेकिन यदि आप बाहर निकलते हैं तो चलते रहेंगे, जबकि पृष्ठभूमि प्रक्रिया आपके द्वारा कमांड को निर्देशित करने के तुरंत बाद वापस आ जाएगी। लेकिन जब आप पृष्ठभूमि में चल रहे कमांड के साथ एक इंटरैक्टिव शेल से बाहर निकलने की कोशिश करते हैं, तो आपको पहले चेतावनी दी जाती है।
केविन एम

2

मार्टिन का जवाब अच्छा है, लेकिन थोड़ा अस्पष्ट है। आदेश हमेशा कांटा और निष्पादित होता है, लेकिन सामान्य शेल व्यवहार कमांड पर प्रतीक्षा करना है जब तक कि यह बाहर नहीं निकलता है। एम्परसेंड इसे पृष्ठभूमि में रखता है ताकि आपको अपना टर्मिनल प्रॉम्प्ट वापस मिल जाए और आप अन्य काम कर सकें। यदि प्रक्रिया डेटा को stdout या stderr के लिए बाहर निकालती है, तो यह आप प्रॉम्प्ट पर जो कुछ भी कर रहे हैं, उसके साथ इंटरमिक्स किया जाएगा और आपको भ्रमित कर सकता है। यही कारण है कि आप फिर> और /path/to/logfile.txt के साथ रीडायरेक्ट करते हैं।

जॉर्ज 2 के जवाब में, एक शेल से बाहर निकलने के लिए सामान्य व्यवहार एक ही प्रक्रिया समूह में सभी प्रक्रियाओं के लिए SIGHUP संकेत भेजना है (अनिवार्य रूप से आपके द्वारा दागे गए सामान) और वे आमतौर पर समाप्त हो जाएंगे। यदि आप चाहते हैं कि यदि आप शेल प्रक्रिया को बंद कर दें तो भी इसे जारी रखा जा सकता है, तो आप उन्हें इस सिग्नल को अनदेखा करने और चालू रखने के लिए nohup कमांड का उपयोग कर सकते हैं। इस प्रकार की प्रक्रिया के लिए एक विशेष नाम है, इसे एक डेमन प्रक्रिया कहा जाता है (उच्चारण 'दानव')।


धन्यवाद धनी! मान लीजिए कि मैं मशीन में ssh टर्मिनल लॉग का उपयोग करता हूं, तो कमांड निष्पादित करने के लिए ssh के टर्मिनल का उपयोग कर रहा है (मान लीजिए कि एक लंबी-प्रक्रिया चलती है), तो अगर मैंने टर्मिनल सत्र छोड़ दिया, तो कमांड की लंबे समय तक चलने वाली प्रक्रिया सही समाप्त हो जाएगी? और अगर मैं चाहता हूं कि यदि मैं शेल छोड़ता हूं तो भी कमांड निष्पादित करना जारी रखता है, तो क्या मुझे nohup का उपयोग करना चाहिए, या & (कमांड के अंत में) या nohup और & का उपयोग करके? और क्यों?
जॉर्ज 2

हे जॉर्ज, माफ करना, मैं इतनी देर से जवाब दे रहा हूं। हां, यदि आप शेल छोड़ देते हैं, तो लंबे समय तक चलने वाली प्रक्रिया समाप्त हो जाएगी। यदि आप चाहते हैं कि यह जारी रहे तो आपको दोनों नोक (शेल बंद होने पर इसे समाप्त नहीं करने के लिए) और (पृष्ठभूमि में रखने के लिए, ताकि आप Crtl-D या अपने शेल से बाहर निकल सकें) करने की आवश्यकता है। आप सेटिस्ड कमांड को भी देख सकते हैं, जो आपकी प्रक्रिया को चलाने की अनुमति देगा, यह थोड़ा अलग तरीके से S नाईटअप को अनदेखा करेगा।
रिच होमोलका

महान जवाब, पृष्ठभूमि से चलने वाली शेल-शुरू की गई प्रक्रियाओं के लिए सर्वोत्तम अभ्यास बताते हैं।
मार्सेल वाल्डेज़ ओरोज्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.