पाइप्ड कमांड किस क्रम में चलते हैं?


89

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

लेकिन मैंने देखा है कि जब लोग ps में किसी विशेष प्रक्रिया को खोजते हैं, तो वे grep -v "grep" को कमांड के अंत में यह सुनिश्चित करने के लिए शामिल करेंगे कि grep अंतिम आउटपुट में प्रकट न हो। इसका मतलब है कि कमांड में ps aux | grep "बैश" | grep -v "grep", जिसका अर्थ है कि ps जानता था कि grep चल रहा था और इसलिए ps के आउटपुट में है। लेकिन अगर ps अपने उत्पादन से पहले चल रहा है, तो उसे कैसे पता चलेगा कि grep चल रहा है?

flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY          TIME CMD
3773 pts/0    00:00:00 bash
3784 pts/0    00:00:00 ps
3785 pts/0    00:00:00 grep

क्यों नहीं एक उत्तर स्वीकार करते हैं ?
törzsmókus

जवाबों:


64

पाइप्ड कमांड समवर्ती रूप से चलते हैं। जब आप दौड़ते हैं ps | grep …, तो यह ड्रॉ (या शेल के कामकाज के विवरण का मामला है जो कर्नेल के आंत्र में शेड्यूलर फाइन-ट्यूनिंग के साथ संयुक्त है) जैसा कि पहले शुरू होता है, psया grepकिसी भी मामले में वे जारी रखते हैं समवर्ती रूप से निष्पादित करें।

यह आमतौर पर दूसरे प्रोग्राम को डेटा को संसाधित करने की अनुमति देने के लिए उपयोग किया जाता है क्योंकि यह पहले प्रोग्राम से बाहर आता है, पहले प्रोग्राम ने अपना ऑपरेशन पूरा किया है। उदाहरण के लिए

grep pattern very-large-file | tr a-z A-Z

grepबड़े फ़ाइल को ट्रैवर्स करने से पहले ही अपरकेस में मिलान लाइनों को प्रदर्शित करना शुरू कर देता है ।

grep pattern very-large-file | head -n 1

पहली मिलान रेखा प्रदर्शित करता है, और grepइसके इनपुट फ़ाइल को पढ़ने से पहले अच्छी तरह से प्रसंस्करण बंद कर सकता है ।

यदि आप कहीं पढ़ते हैं कि पाइप किए गए प्रोग्राम अनुक्रम में चलते हैं, तो इस दस्तावेज़ को छोड़ दें। पाइप किए गए कार्यक्रम समवर्ती और हमेशा होते हैं।


7
और इस उदाहरण के बारे में क्या अच्छा है कि जब सिर को एक पंक्ति की आवश्यकता होती है, तो यह समाप्त हो जाता है और जब grep इस पर ध्यान देता है, तो यह कुछ भी नहीं के लिए आगे का काम किए बिना भी समाप्त हो जाता है।
जो

मुझे लगता है कि पाइप के बारे में किसी तरह का आईओ बफर है ... मुझे कैसे पता चलेगा कि यह बाइट्स में आकार है? इसके बारे में अधिक जानने के लिए मैं क्या पढ़ना चाहता हूं? :)
n611x007

3
@ नक्सा वास्तव में दो बफ़र हैं। वहाँ कार्यक्रम के अंदर stdio बफर है grep, और पाइप में ही कर्नेल द्वारा प्रबंधित एक बफर है। बाद के लिए, देखें कि पाइप बफर कितना बड़ा है?
गाइल्स

49

आदेशों को चलाया जाता है वास्तव में कोई फर्क नहीं पड़ता और गारंटी नहीं है। के रहस्यमय विवरण अलग छोड़कर pipe(), fork(), dup()और execve(), खोल पहले पाइप, डेटा है कि प्रक्रियाओं के बीच प्रवाह होगा के लिए नाली बनाता है, और फिर उन्हें से जुड़े पाइप के सिरों के साथ प्रक्रियाओं पैदा करता है। पहली प्रक्रिया जिसे चलाया जाता है, वह दूसरी प्रक्रिया से इनपुट की प्रतीक्षा में अवरुद्ध हो सकती है, या पाइप से डेटा पढ़ना शुरू करने के लिए दूसरी प्रक्रिया की प्रतीक्षा कर रही है। ये इंतजार मनमाने ढंग से लंबा हो सकता है और कोई फर्क नहीं पड़ता। जो भी प्रक्रियाएं चलती हैं, डेटा अंततः स्थानांतरित हो जाता है और सब कुछ काम करता है।


5
अच्छा जवाब, लेकिन ओपी को लगता है कि प्रक्रियाएं क्रमिक रूप से चलती हैं। आप यहाँ यह स्पष्ट कर सकते हैं कि प्रक्रियाएँ समवर्ती रूप से चल रही हैं, और पाइप की तरह है .... बाल्टी के बीच एक पाइप, जहाँ पानी लगभग (लगभग) एक ही समय में बहता है।
कीथ

स्पष्टीकरण के लिए धन्यवाद। जिन स्रोतों को मैं पढ़ रहा हूं, ऐसा लगता है जैसे कि पाइप्ड प्रोग्राम क्रमिक रूप से चलने के बजाय क्रमिक रूप से चले।
action_potato

अनिर्धारित फैशन में शुरू होने वाली प्रक्रियाओं को अनुभव करने के लिए यह 1000 बार चलाने की कोशिश करें: इको -na> & 2 | इको बी> और 2
ओले तांगे

28

मृत घोड़े की पिटाई के जोखिम पर, गलतफहमी यह है कि लगता है

     | बी

के बराबर है

    एक > temporary_file 
    बी < temporary_file 
    rm temporary_file

लेकिन, वापस जब यूनिक्स बनाया गया था और बच्चों ने डायनासोर को स्कूल में सवारी की थी, तो डिस्क बहुत छोटे थे, और एक सौम्य आदेश के लिए एक फ़ाइल सिस्टम में सभी खाली स्थान का उपभोग करना सामान्य था। अगर Bकुछ ऐसा था , तो पाइपलाइन का अंतिम आउटपुट उस मध्यवर्ती फ़ाइल की तुलना में बहुत छोटा हो सकता है । इसलिए, पाइप को " पहले रन" के लिए शॉर्टहैंड के रूप में विकसित नहीं किया गया था , और फिर के आउटपुट से इनपुट के साथ बी चलाएं , लेकिन इसके साथ समवर्ती रूप से निष्पादित करने और मध्यवर्ती फ़ाइल को संग्रहीत करने की आवश्यकता को समाप्त करने के तरीके के रूप में। डिस्क पर।grep some_very_obscure_stringBA


2
यह जवाब देता है कि क्यों और इसलिए मेरा वोट मिलता है।
LIttle प्राचीन वन कामी

1

आमतौर पर आप इसे बैश के नीचे चलाते हैं। प्रक्रिया काम कर रही है और समवर्ती रूप से शुरू हो रही है, लेकिन समानांतर में शेल द्वारा चल रही है। यह कैसे संभव है?

  1. यदि यह पाइप में अंतिम कमांड नहीं है, तो सॉकेट की जोड़ी के साथ अनाम पाइप बनाएं
  2. कांटा
  3. यदि आवश्यक हो तो बच्चे को स्टड / स्टडआउट को सॉकेट्स में भेजना (पाइप स्टड में पहली प्रक्रिया के लिए पुन: असाइन नहीं किया जाता है, अंतिम प्रक्रिया और उसके स्टडआउट के लिए)
  4. बच्चे EXEC में मूल शेल कोड को स्वीप करने वाले तर्कों के साथ निर्दिष्ट कमांड है, लेकिन उनके द्वारा खोले गए सभी को छोड़ देता है। चाइल्ड प्रोसेस आईडी नहीं बदली जाएगी क्योंकि यह वही चाइल्ड प्रोसेस है
  5. बच्चे के साथ समवर्ती लेकिन मुख्य खोल के नीचे समानांतर चरण 1 पर जाते हैं।

सिस्टम गारंटी नहीं देता है कि कितनी तेजी से निष्पादित किया जाएगा और निर्दिष्ट कमांड शुरू होगा। यह शेल के लिए स्वतंत्र है, लेकिन सिस्टम। यह है क्योंकि:

ps auxww| grep ps | cat

एक बार शो grepऔर / या psकमांड, और अब अगला। यह निर्भर करता है कि सिस्टम निष्पादन फ़ंक्शन का उपयोग करके कर्नेल वास्तव में कितनी तेजी से प्रक्रियाएं शुरू करता है।


1
समवर्ती निष्पादन का मतलब है कि दो या अधिक प्रक्रियाएं एक ही समय सीमा के भीतर निष्पादित होती हैं, आमतौर पर उनके बीच किसी प्रकार की निर्भरता के साथ। समानांतर निष्पादन का मतलब है कि दो या अधिक प्रक्रियाएं एक साथ निष्पादित होती हैं (उदाहरण के लिए एक ही समय में अलग सीपीयू कोर)। समानांतरवाद प्रश्न के लिए प्रासंगिक नहीं है, और न ही "कितनी तेजी से" exec()निष्पादित किया जाता है, लेकिन exec()एक पाइप में कार्यक्रमों की कॉल और निष्पादन कैसे हल किया जाता है
थॉमस निमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.