मुझे प्रतीक्षा किए बिना एक कमांड चलाएं


145

सीएलआई पर, कभी-कभी एक कमांड जिसे मैं टाइप करता हूं उसे पूरा करने में थोड़ा समय लगता है, और कभी-कभी मुझे पता होता है कि कब ऐसा होने वाला है। मैं "पृष्ठभूमि" और ऐसे लिनक्स में थोड़ा भ्रमित हूं।

सीएलआई को बताने का सबसे आम (या उपयोगकर्ता के अनुकूल तरीका) है कि मैं इंतजार नहीं करना चाहता, कृपया मुझे तुरंत अपना संकेत दें। और अगर यह मुझे एक प्रगति बार या बस व्यस्त-स्पिनर दे सकता है, तो यह बहुत अच्छा होगा!


3
यह भी देखें कि आप सीधे पृष्ठभूमि पर कमांड लाइन ऐप कैसे भेजते हैं? यदि आपने पहले ही कमांड शुरू कर दिया है और इसे बैकग्राउंड में भेजना चाहते हैं।
गिल्स

जवाबों:


153

कमांड चलाने से पहले, आप &बैकग्राउंड में चलने के लिए कमांड लाइन पर अप्लाई कर सकते हैं :

long-running-command &

एक कमांड शुरू करने के बाद, आप CtrlZइसे निलंबित करने के लिए दबा सकते हैं , और फिर bgइसे पृष्ठभूमि में रख सकते हैं:

long-running-command
[Ctrl+Z]
bg

मैंने "find ~ / a.java &" कमांड का उपयोग किया लेकिन मैं पृष्ठभूमि में नहीं गया? इसके अलावा, मैंने cmd + z (मैक के लिए) की कोशिश की .... यह काम नहीं कर रहा है
अभिमन्यु आर्यन

1
@ अभिमन्यु आर्यन, हो सकता है कि आप find ...पहले अपने आदेश को डिबग करना चाहते हों , फिर उसे पृष्ठभूमि में चलाएं। इस मामले में आप -nameविकल्प याद कर रहे थे ।
एलेक्सिस विल्के

113

यह सभी की पसंदीदा है क्योंकि प्रक्रिया को पृष्ठभूमि में भेजने के अलावा आपको अपने टर्मिनल को गंदा करने वाले पाठ आउटपुट के बारे में चिंता करने की ज़रूरत नहीं है:

nohup command &

यह न केवल पृष्ठभूमि में प्रक्रिया को चलाता है, एक लॉग भी बनाता है ( nohup.outवर्तमान निर्देशिका में कहा जाता है, यदि यह संभव नहीं है, तो आपके घर की निर्देशिका) और यदि आप चालू शेल को बंद / लॉगआउट करते हैं तो प्रक्रिया बच्चे को मारने से रोकने में सक्षम नहीं है। माता-पिता के संकेत जब मारे जाते हैं (यानी, लॉग अप करने के लिए, माता-पिता को SITUP द्वारा, या वर्तमान शेल को बंद करना)।

वहाँ अन्य कहा जाता है, disownलेकिन यह बल्कि अन्य उत्तरों का एक विस्तार है कि अपने आप में एक विधि है:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

ये आदेश आपको प्रक्रिया आउटपुट को आसानी से पुनर्प्राप्त करने की अनुमति नहीं देते हैं जब तक कि आप इसे प्राप्त करने के लिए हैकिश तरीके का उपयोगकरें।


4
Sysadmin '95 के बाद से। आज तक कभी नहीं सुना, धन्यवाद! यह हर शेल के साथ काम नहीं करता है (हालांकि bash, zsh, tcsh। Tcsh ने काम नहीं किया है)।
यूनिक्स

nohupएक नौकरी नियंत्रण खोल में उपयोग करना मूर्खतापूर्ण है। आधुनिक गोले HUPपृष्ठभूमि प्रक्रियाओं को नहीं भेजते हैं। एक अद्वितीय फ़ाइल नाम के लिए पुनर्निर्देशन भुगतान करने के लिए एक छोटी सी कीमत है।
लड़कियों

@chicks का उपयोग यहां मामला है कि टर्मिनल को प्रदूषित करने के लिए स्टडर और स्टडआउट को रोकने के लिए प्लस के साथ यह स्वचालित रूप से एक लॉग फ़ाइल बनाता है।
Braiam

1
command > file.log 2>&1 & disownसे थोड़ा लंबा है, nohup command &लेकिन मुझे लगता है कि @chicks क्या सुझाव दे रहा था।
joeytwield

31

शायद यही आप चाहते हैं

my_command > output.log 2>&1 &

यह आपके आदेश को शुरू करेगा, दोनों को stdout और stderr पर पुनर्निर्देशित करना, output.logजिसे आप निर्दिष्ट कर सकते हैं। यदि आप आउटपुट को स्टोर करने की परवाह नहीं करते हैं - तो आप /dev/nullवास्तविक फ़ाइल के बजाय उपयोग कर सकते हैं ।

&पृष्ठभूमि में कमांड निष्पादित करेगा ताकि आप चलते समय कमांडिंग इनपुट जारी रख सकें। 2>&1स्टडआउट को पुनर्निर्देशित करता है ताकि सभी आउटपुट पकड़े जाएं।

इसके अलावा, जब आप इस तरह से एक कमांड चलाते हैं, तो आपको इसके समान कर्नेल से एक पुष्टिकरण प्राप्त करना चाहिए: [2] 1234 इसका मतलब है कि आपकी प्रक्रिया पृष्ठभूमि में चल रही है और इसकी आईडी है 1234, इसलिए यदि आप चाहें तो इसे बाद में मार सकते हैंkill -9 1234


2
धन्यवाद, 2>&1बहुत महत्वपूर्ण coz कमांड विफल हो सकता है और इसे कुछ मामलों में त्रुटि का उत्पादन करने की कोशिश कर सकता है!
ericn

1
यह एक काम किया जब उपरोक्त जवाब धन्यवाद नहीं था।
डोमगोज

9

में देखो स्क्रीन या tmux । इसके साथ एक उदाहरण tmux:

$ tmux new -d 'longrunningcommand'

जबकि पृष्ठभूमि के लिए 'और' का उपयोग करने वाले अन्य उत्तर काम करेंगे, आपको stdout (और stderr!) को पुनर्निर्देशित करना होगा। ऐसा किए बिना, आउटपुट सीधे आपके शेल में जाएगा, जो भी अन्य आउटपुट आपके पास हो सकता है, के साथ मिलाकर।

यदि आप एक लंबी कमांड चला रहे हैं और डिस्कनेक्ट हो गए या डिस्कनेक्ट हो गए तो बैकग्राउंडिंग भी विफल हो जाएगी। सिस्टम आपकी नौकरी मार देगा।

यदि आप स्क्रीन या tmux से परिचित नहीं हैं, तो वे मूल रूप से आपको अपने शेल से पूरी तरह से अलग करने की अनुमति देते हैं। अपने प्रोग्राम को बैकग्राउंड करने के बजाय, आप पूरे शेल को बैकग्राउंड करें। फिर आप इसे बाद में किसी अन्य कंप्यूटर से भी वापस स्विच कर सकते हैं। उन दोनों में एक टन अधिक विशेषताएं हैं जो आपको इस उपयोग के मामले से परे उपयोगी हो सकती हैं या नहीं।

स्क्रीन पुराना आजमाया हुआ और सच्चा कार्यक्रम है; tmux बहुत छोटा है लेकिन स्क्रीन के अतीत से सीखा है।


यह उत्तर वास्तविक उत्तर याद करता है और RTFM की तरह लगता है।
ल्लोकी

5

(पूर्णता के लिए-- पहले से ही उत्तर दिया गया :) आपने आदेश के &बाद जोड़कर पृष्ठभूमि में एक आदेश दिया :

long_command with arguments > redirection &

मैं आपके प्रश्न के दूसरे भाग को संबोधित करने के लिए इस उत्तर को जोड़ रहा हूँ:

इन-प्रोग्रेस बैकग्राउंड कमांड दिखाने के लिए स्पिनर का कोई वास्तविक समकक्ष नहीं है, लेकिन आप टाइप करके jobsया बैकग्राउंड कमांड्स की स्थिति देख सकते हैं jobs -l। यह आपको आपकी पृष्ठभूमि वाली कमांड दिखाएगा, और चाहे वे चल रहे हों, सिग्नल के माध्यम से रुके (जैसे, साथ ^Z), या कभी-कभार रुक गए क्योंकि वे आपसे इंटरएक्टिव इनपुट की प्रतीक्षा कर रहे हैं।


long_command with arguments &> redirection &stderrभी पुनर्निर्देशित करने के लिए
आइस-ब्लेज़

3

आप का उपयोग कर पृष्ठभूमि में एक कार्यक्रम चला सकते हैं &। उदाहरण के लिए, यदि आप उदाहरण के लिए दौड़ना चाहते हैं, तो आप दौड़ yum install XyZसकते हैं:

yum install XyZ &

stdoutकार्यक्रम से या उत्पादन का उपयोग कर पुनः निर्देशित किया जा सकता है >एक फ़ाइल को अधिलेखित करने के लिए, या >>एक फाइल करने के लिए संलग्न करने के लिए। उदाहरण के लिए, यदि आप yumकिसी फ़ाइल में लॉग इन करना चाहते हैं yum.log:

yum install XyZ > yum.log &

या, यदि आप किसी मौजूदा फ़ाइल में आउटपुट जोड़ना चाहते हैं log:

yum install XyZ >> log &

त्रुटियों को मुद्रित किया जाता है stderrऔर नहीं stdout, और उसी तरह से एक फ़ाइल पर पुनर्निर्देशित किया जा सकता है, लेकिन उपयोग करना 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

तुम दोनों अनुप्रेषित करना चाहता है तो stderrऔर stdout, आप उपयोग कर सकते हैं &>:

yum install XyZ &> output
yum install XyZ &>> output

2

आप बस &इसके बाद साइन लगाकर बैकग्राउंड में कमांड चला सकते हैं ।

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

areallylong_command &

इसे पृष्ठभूमि में चलाएंगे।

आप आगे की फ़ाइलों के लिए stdout / stderr को पुनर्निर्देशित कर सकते हैं ताकि वे आपके टर्मिनल पर दिखाई न दें जब आप कुछ कर रहे हों।

अधिक जानकारी के लिए इसे देखें: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html


0

अपने लंबे समय से चल रहे कार्य को शुरू करने से पहले 'स्क्रीन' कमांड का उपयोग करने का प्रयास करें। जब आप अलग हो जाते हैं तब आप 'स्क्रीन -r -d' के साथ जब भी आपको फिर से आवश्यकता होती है तब वापस भेज सकते हैं। मुझे लगता है कि ssh या अन्य नेटवर्क कनेक्शन पर टर्मिनल का उपयोग करते समय वे कभी-कभी सर्वर से खराब कनेक्शन द्वारा टूट सकते हैं। इसे 'स्क्रीन' के अंदर चलाने से यह समस्या ठीक हो जाती है।

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