मैं पृष्ठभूमि प्रक्रियाओं का आउटपुट क्यों देख सकता हूं?


31

उदाहरण के लिए, जब मैं टाइप करता हूं, तो ping 8.8.8.8 &हम पिंग प्रक्रिया को काम करते हुए क्यों देख सकते हैं? और जब मैं टाइप करता हूं find / -name '*test*' &, तो इसे मॉनिटर पर भी देखा जाता है।

ऐसा क्यों है? क्या यह वास्तव में पृष्ठभूमि में नहीं है?

जवाबों:


43

&अतुल्यकालिक रूप से पृष्ठभूमि में आदेश को चलाने के लिए खोल, यानी, यह काँटेदार और एक अलग उप खोल में चलाया जाता है, एक नौकरी के रूप में निर्देशन,।

ध्यान दें कि जब आप &आउटपुट डालते हैं - दोनों stdout और stderr - तब भी स्क्रीन पर मुद्रित किया जाएगा । आप स्क्रीन पर किसी भी उत्पादन नहीं देखना चाहते हैं, तो दोनों अनुप्रेषित stdoutऔर stderrसे एक फाइल करने के लिए:

myscript > ~/myscript.log 2>&1 &

यदि आप बाद में त्रुटियों का विश्लेषण करने के बारे में चिंतित नहीं हैं, तो आमतौर पर आप stderrइसे पुनर्निर्देशित करके त्यागना चाह सकते हैं /dev/null

आप एक ही समय में अलग उप-गोले में कमांड / स्क्रिप्ट भी चला सकते हैं। उदाहरण के लिए;

./script1 & ./script2 & ./script3 & 

कमांड के पूरा होने से पहले एक बैकग्राउंड जॉब को कमांड लाइन में वापस लाया जा सकता है:

fg <job-number>

job-numberचलाकर प्राप्त किया जा सकता

jobs

अच्छा उत्तर। आप यह भी शामिल कर सकते हैं कि /dev/nullटर्मिनल आउटपुट को रीडायरेक्ट करने के लिए एक फाइल के रूप में भी उपयोग किया जा सकता है अगर कोई इसे बचाने के बजाय आउटपुट को छोड़ना चाहता है। और क्या मैं सही हूं कि इसे 2>&1पुनर्निर्देशित किया stderrजाए stdout? शायद आप यह भी स्पष्ट करना चाहते हैं ... धन्यवाद।
बाइट कमांडर

@ByteCommander धन्यवाद :) संपादित, उम्मीद है कि यह अब स्पष्ट है। हां, आप सही हैं, पर 2>&1पुनर्निर्देशित stderrकरता है stdout
रॉन

3
मुझे लगता है कि यह ध्यान देने योग्य stty tostopहोगा कि पृष्ठभूमि की नौकरियों को निलंबित कर दिया जाएगा अगर वे टर्मिनल पर लिखने की कोशिश करेंगे।
कैस्परड

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

ऐसा करने का एकमात्र नकारात्मक पहलू यह है कि आउटपुट के आदेश को stdout और stderr में लॉग फ़ाइल में मिलाया जा सकता है।
Matthieu

8

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

वास्तव में, आप चला सकते हैं ping 8.8.8.8 &और find / -name '*test*' &एक ही समय में (एक मिश्रित उत्पादन में जिसके परिणामस्वरूप), लेकिन आप नहीं चल सकते हैं ping 8.8.8.8और find / -name '*test*'एक ही खोल पर एक ही समय में।

यदि आप कुछ भी नहीं देखना चाहते हैं, तो कुछ का उपयोग करें ping 8.8.8.8 &> /dev/null &


इसके अतिरिक्त, आप nohupऔर के बारे में जानने के लिए चाहते हो सकता है disown


disown आउटपुट को टर्मिनल पर प्रिंट होने से नहीं रोकता है।
रुस्लान

@Ruslan: नहीं, लेकिन यह शेल से काम निकालता है। जो कुछ हो सकता है (या नहीं हो सकता है) ओपी को इसमें दिलचस्पी हो सकती है।
एंड्रिया कोरबेलिनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.