पाइपलाइन (यूनिक्स)
यूनिक्स जैसे कंप्यूटर परिचालन प्रणाली में, पाइपलाइन संदेश मार्ग का उपयोग करके अंतर-प्रक्रिया संचार के लिए तंत्र होता है। पाइपलाइन उनकी मानक धाराओं द्वारा श्रृंखलाबद्ध प्रक्रिया (कंप्यूटिंग) का समूह है, जिससे प्रत्येक प्रक्रिया का आउटपुट पाठ (स्टडआउट) सीधे इनपुट (स्टडिन) के रूप में आगामी में पारित हो जाए। द्वितीय प्रक्रिया प्रारम्भ की जाती है क्योंकि प्रथम प्रक्रिया अभी भी निष्पादित हो रही है, और और उन्हें समवर्ती रूप से निष्पादित किया जाता हैI
पाइपलाइनों की अवधारणा को यूनिक्स के विकास के समय, इसके उपकरण बॉक्स दर्शन को आकार देते हुए, यूनिक्स के पैतृक होम बेल लैब्स में डगलस मैक्लॉयय द्वारा समर्थित किया गया था, जिसने इसके यूनिक्स दर्शन को आकार दिया था।[1][2] इसे भौतिक पाइपलाइन परिवहन के सादृश्य द्वारा नामित किया गया है। इन पाइपलाइनों की प्रमुख विशेषता उनके आंतरिक (रिची एंड थॉम्पसन, 1974) भागों को गुप्त रखना है। यह परिणाम स्वरुप प्रणाली में अधिक स्पष्टता और सरलता की अनुमति देता है।
यह लेख अज्ञात पाइपों के सम्बन्ध में है, जहां प्रक्रिया द्वारा लिखे गए डेटा को परिचालन प्रणाली द्वारा तब तक बफर किया जाता है जब तक कि इसे आगामी प्रक्रिया द्वारा पढ़ा नहीं जाता है, और प्रक्रियाएं पूर्ण होने पर यह यूनिडायरेक्शनल चैनल विलुप्त हो जाता है। यह नामित पाइपों से भिन्न होता है, जहां संदेशों को पाइप से या उससे निकट किया जाता है, जिसे फ़ाइल बनाकर नामित किया जाता है, और प्रक्रियाएं पूर्ण होने के पश्चात् भी बनी रहती हैं। अज्ञात पाइपों के लिए मानक शैल (कंप्यूटिंग) सिंटैक्स कई कमांडों को सूचीबद्ध करना है, जो ऊर्ध्वाधर पट्टियों (सामान्य यूनिक्स शब्दाडंबर में "पाइप") से भिन्न होते हैं:
command1 | command2 | command3
उदाहरण के लिए, वर्तमान निर्देशिका (ls), में फ़ाइलों को सूचीबद्ध करने के लिए, स्ट्रिंग "key" (grep) वाले ls आउटपुट की केवल पंक्तियों को बनाए रखें, और परिणाम को स्क्रॉलिंग पेज (less) में देखें, उपयोगकर्ता अंतिम स्टेशन की कमांड लाइन में निम्नलिखित टाइप करता है:
ls -l | grep key | less
कमांड ls -l
को प्रक्रिया के रूप में निष्पादित किया जाता है, जिसके आउटपुट (स्टडआउट) grep key
को प्रक्रिया के इनपुट (स्टडिन) पर पाइप किया जाता है ; और इसी प्रकार प्रक्रिया के लिए less
प्रक्रिया (कंप्यूटिंग) पूर्व प्रक्रिया से इनपुट प्राप्त करती है, और मानक स्ट्रीम के माध्यम से आगामी प्रक्रिया के लिए आउटपुट उत्पन्न करती है। प्रत्येक |
शेल को बायीं ओर कमांड के मानक आउटपुट को दाहिनी ओर कमांड के मानक इनपुट से कनेक्ट करने के लिए कमांड प्रदान करता है, जिसे परिचालन प्रणाली में कार्यान्वित अज्ञात पाइप कहा जाता है। पाइप्स यूनिडायरेक्शनल हैं; डेटा पाइपलाइन के माध्यम से बाएं से दाएं जाता है।
उदाहरण
नीचे पाइपलाइन का उदाहरण दिया गया है जो यूनिफ़ॉर्म रिसोर्स लोकेटर वर्ल्ड वाइड वेब संसाधन के लिए वर्तनी बानान चेकर प्रारम्भ करता है। यह क्या करता है इसका स्पष्टीकरण इस प्रकार है।
curl "https://en.wikipedia.org/wiki/Pipeline_(Unix)" |
sed 's/[^a-zA-Z ]/ /g' |
tr 'A-Z ' 'a-z\n' |
grep '[a-z]' |
sort -u |
comm -23 - <(sort /usr/share/dict/words) |
less
curl
वेब पेज की HTML सामग्री प्राप्त करता है (उपयोग कर सकता हैwget
कुछ प्रणालियों पर)।sed
सभी वर्णों (वेब पृष्ठ की सामग्री से) को रिक्त स्थान से परिवर्तित कर देता है जो रिक्त स्थान या अक्षर नहीं हैं। (नई पंक्ति संरक्षित हैं।)tr
सभी अपरकेस अक्षरों को लोअरकेस में परिवर्तित कर देता है, और रिक्त स्थान को टेक्स्ट की पंक्तियों में न्यूलाइन्स में परिवर्तित कर देता है (प्रत्येक 'शब्द' अब भिन्न लाइन पर है)।grep
केवल उन पंक्तियों को सम्मिलित करता है जिनमें कम से कम लोअरकेस वर्णानुक्रमिक वर्ण होता है (किसी भी रिक्त रेखा को त्यागते हुए)।sort
'शब्दों' की सूची को वर्णानुक्रम में क्रमबद्ध करता है, और-u
स्विच प्रतिरूप त्यागता है।comm
दो फाइलों के मध्य सामान्य लाइनों को परिक्षण करता है,-23
दूसरी फ़ाइल के लिए अद्वितीय पंक्तियों को दबा देता है, और जो दोनों के लिए सामान्य हैं, केवल उन कमांड को त्यागकर जो केवल प्रथम फ़ाइल में पाए जाते हैं।-
e> फ़ाइल नाम के स्थान पर कारण बनता है,comm
इसके मानक इनपुट (इस विषय में पाइप लाइन से) का उपयोग करने के लिए।sort /usr/share/dict/words
की सामग्री को क्रमबद्ध करता हैwords
फ़ाइल वर्णानुक्रम में, ascomm
अपेक्षा करता है, और<( ... )
परिणामों को अस्थायी फ़ाइल (प्रक्रिया प्रतिस्थापन के माध्यम से) में आउटपुट करता है, जोcomm
पढ़ता है। परिणाम उन शब्दों (पंक्तियों) की सूची है जो /usr/share/dict/words में नहीं पाए जाते हैं।less
उपयोगकर्ता को परिणामों के माध्यम से पेज करने की अनुमति देता है।
कमांड लाइन इंटरफेस में पाइपलाइन
सभी व्यापक रूप से उपयोग किए जाने वाले यूनिक्स शेल में पाइपलाइनों के निर्माण के लिए विशेष सिंटैक्स निर्माण होता है। सभी उपयोगों में व्यक्ति ASCII ऊर्ध्वाधर बार |
कैरेक्टर द्वारा पृथक किए गए क्रम में कमांड लिखता है (जिसे, इस कारण से, प्रायः "पाइप पात्र" कहा जाता है)। शेल प्रक्रियाएं शुरू करता है और उनकी मानक धाराओं (कुछ मात्रा में बफर (कंप्यूटर विज्ञान) सहित) के मध्य आवश्यक सम्बन्ध की व्यवस्था करता है।
त्रुटि स्ट्रीम
पाइपलाइन में प्रक्रियाओं की मानक त्रुटि धाराएँ ("stderr") पाइप के माध्यम से पारित नहीं होती हैं; इसके अतिरिक्त , उन्हें विलय कर दिया जाता है और सिस्टम कंसोल पर निर्देशित कर दिया जाता है। चूँकि, कई शेल्स में इस व्यवहार को परिवर्तित करने के लिए अतिरिक्त सिंटैक्स होता है। उदाहरण के लिए, सीएसएच शेल में |
के अतिरिक्त |&
का उपयोग करना यह दर्शाता है कि मानक त्रुटि स्ट्रीम को भी मानक आउटपुट के साथ विलय कर आगामी प्रक्रिया में संचय किया जाना चाहिए। बैश (यूनिक्स शेल) 4.0[3] के पश्चात् से मानक त्रुटि को |&
के साथ विलय कर सकता है या 2>&1
का उपयोग कर सकता है, साथ ही इसे भिन्न फ़ाइल पर पुनर्निर्देशित भी कर सकता है।
पाइपमिल
सबसे अधिक उपयोग की जाने वाली सरल पाइपलाइनों में शेल पाइप के माध्यम से उप-प्रक्रियाओं की श्रृंखला को जोड़ता है, और प्रत्येक उप-प्रक्रिया के अंदर बाहरी कमांड निष्पादित करता है। इस प्रकार शेल स्वयं पाइपलाइन के माध्यम से प्रवाहित होने वाले डेटा का कोई प्रत्यक्ष प्रसंस्करण नहीं कर रहा है।
चूँकि, शेल के लिए तथाकथित मिल या पिपमिल का उपयोग करके सीधे प्रसंस्करण करना संभव है (चूंकि while
कमांड का उपयोग प्रारंभिक कमांड से परिणामों को मिलाने के लिए किया जाता है)। यह निर्माण सामान्यतः कुछ ऐसा दिखता है:
command | while read -r var1 var2 ...; do
# process each line, using variables as parsed into var1, var2, etc
# (note that this may be a subshell: var1, var2 etc will not be available
# after the while loop terminates; some shells, such as zsh and newer
# versions of Korn shell, process the commands to the left of the pipe
# operator in a subshell)
done
यदि लूप की बॉडी में कमांड सम्मिलित हैं, जैसे कि cat
और ssh
, जिससे पढ़ा गया stdin
:[4] लूप के पूर्व पुनरावृत्ति पर, ऐसा प्रोग्राम (इसे ड्रेन कहते हैं) शेष आउटपुट को command
पढ़ेगा , और लूप तब समाप्त हो जाएगा (ड्रेन की बारीकियों के आधार पर परिणामों के साथ)। इस व्यवहार से बचने के कुछ संभावित उपाय हैं। कुछ ड्रेन stdin
से पढ़ने को अक्षम करने के विकल्प का समर्थन करती हैं (उदाहरण के लिए ssh -n
) I वैकल्पिक रूप से, ड्रेन को कुछ उपयोगी करने के लिए stdin
से किसी इनपुट को पढ़ने की आवश्यकता नहीं है तो इसे इनपुट के रूप में< /dev/null
दिया जा सकता है।
जैसा कि पाइप के सभी घटक समानांतर में चलते हैं, शेल सामान्यतः इसकी सामग्री को संभालने के लिए उपप्रक्रिया (उपशेल) को फोर्क करता है, जिससे बाहरी शेल वातावरण में परिवर्तनशील परिवर्तनों को प्रसारित करना असंभव हो जाता है। इस समस्या का समाधान करने के लिए, पिपमिल को कमांड प्रतिस्थापन वाले प्रपत्र से संचय किया जा सकता है, जो सामग्री के माध्यम से मिलिंग से पहले पाइपलाइन के चलने का प्रतीक्षा करता है। वैकल्पिक रूप से, समानांतर निष्पादन के लिए नामित पाइप या प्रक्रिया प्रतिस्थापन का उपयोग किया जा सकता है। जीएनयू बैश में भी a lastpipe
अंतिम पाइप घटक के लिए फोर्किंग को अक्षम करने का विकल्प भी होता है।[5]
प्रोग्रामेटिक रूप से पाइपलाइन निर्मित करना
कार्यक्रम नियंत्रण के अंतर्गत पाइपलाइनों का निर्माण किया जा सकता है। यूनिक्स pipe()
प्रणाली कॉल परिचालन प्रणाली को नया अज्ञात पाइप लक्ष्य बनाने के लिए कहता है। इसके परिणामस्वरूप प्रक्रिया में दो नए, खुले फाइल वर्णनकर्ता होते हैं: पाइप का केवल-पढ़ने वाला अंत, और केवल-लिखने वाला अंत पाइप के सिरे सामान्य, अज्ञात फ़ाइल वर्णनकर्ता प्रतीत होते हैं, अतिरिक्त इसके कि उनमें खोज करने की कोई क्षमता नहीं होती है।
गतिरोध से बचने और समांतरता का लाभ प्राप्त करने के लिए, अधिक नए पाइपों के साथ यूनिक्स प्रक्रिया सामान्यतः नई प्रक्रियाएँ बनाने के लिए fork()
को कॉल करेगी I प्रत्येक प्रक्रिया किसी भी डेटा का उत्पादन या उपभोग करने से पहले पाइप के शीर्षो को बंद कर देगी जिनका वह उपयोग नहीं करेगा I वैकल्पिक रूप से, प्रक्रिया नए पथ्रेडस बना सकती है और उनके मध्य संचार करने के लिए पाइप का उपयोग कर सकती है।
नामित पाइपों को mkfifo()
या mknod()
का उपयोग करके भी बनाया जा सकता है और फिर प्रोग्रामों में इनपुट या आउटपुट फ़ाइल के रूप में प्रस्तुत किया जाता है क्योंकि उन्हें प्रारम्भ किया जाता है। वे मल्टी-पाथ पाइप बनाने की अनुमति देते हैं, और मानक त्रुटि पुनर्निर्देशन, या tee
के साथ संयुक्त होने पर विशेष रूप से प्रभावी होते हैं। .
कार्यान्वयन
अधिकांश यूनिक्स जैसी प्रणालियों में, पाइपलाइन की सभी प्रक्रियाएं एक ही समय में प्रारम्भ होती हैं, उनकी धाराएं उचित रूप से जुड़ी होती हैं, और मशीन पर चलने वाली अन्य सभी प्रक्रियाओं के साथ निर्धारण (कंप्यूटिंग) द्वारा प्रबंधित की जाती है। इसका महत्वपूर्ण विषय, यूनिक्स पाइप को अन्य पाइप कार्यान्वयन से पृथक करना और बफ़र (कंप्यूटर विज्ञान) की अवधारणा है: उदाहरण के लिए प्रेक्षित होने वाला प्रोग्राम प्रति सेकंड 5000 बाइट उत्पन्न कर सकता है, और प्राप्त करने वाला प्रोग्राम केवल 100 बाइट प्रति सेकंड स्वीकार करने में सक्षम हो सकता है, दूसरा लेकिन कोई डेटा विलुप्त नहीं हुआ है। इसके अतिरिक्त, प्रेक्षित होने वाले प्रोग्राम का आउटपुट बफर में रखा जाता है। जब प्राप्त करने वाला प्रोग्राम डेटा पढ़ने के लिए उपस्थित होता है, तो पाइपलाइन में आगामी प्रोग्राम बफर से पढ़ता है। यदि बफ़र भरा हुआ है, तो प्रेषण कार्यक्रम को तब तक रोक दिया जाता है (अवरुद्ध) जब तक कि रिसीवर द्वारा बफ़र से कम से कम कुछ डेटा हटा नहीं दिया जाता है। लिनक्स में, बफर का आकार 65,536 बाइट्स (64KiB) है। bfr नामक ओपन स्रोत तृतीय-पक्ष फ़िल्टर आवश्यकता पड़ने पर बड़े बफ़र प्रदान करने के लिए उपलब्ध है।
नेटवर्क पाइप
नेटकैट और सोकेट जैसे उपकरण पाइपों को टीसीपी/आईपी इंटरनेट परिपथ से जोड़ सकते हैं।
इतिहास
पाइपलाइन अवधारणा का आविष्कार डगलस मैक्लॉयय ने किया था,[6] और प्रथम संस्करण 3 यूनिक्स के मैन पेजों में वर्णित है।[7] मैकिलॉय ने देखा कि अधिकांश समय यूनिक्स शेल ने आउटपुट फ़ाइल को प्रोग्राम से दूसरे में इनपुट के रूप में पारित किया है।
उनके विचारों को 1973 में प्रस्तावित किया गया था, जब (मैकइलरॉय ने लिखा था, विह्वल रात में) केन थॉम्पसन ने शेल में pipe()
प्रणाली कॉल और पाइप और संस्करण 3 यूनिक्स में कई उपयोगिताओं को जोड़ा। मैक्लरॉय ने प्रारम्भ रखा, एक-लाइनर्स का अविस्मरणीय आर्गी देखा, क्योंकि प्लंबिंग के उत्साह में सम्मिलित हो गया। मैकिलॉय भी थॉम्पसन को इसका श्रेय देता है I |
अंकन, जिसने संस्करण 4 यूनिक्स में पाइप सिंटैक्स के विवरण को बहुत सरल बना दिया।[8][7]
यद्यपि स्वतंत्र रूप से विकसित, यूनिक्स पाइप 1960 के दशक में डार्टमाउथ टाइम शेयरिंग प्रणाली के लिए केन लोचनर [9] द्वारा विकसित 'संचार फ़ाइलें' से संबंधित हैं, और उनसे पूर्व भी थे।[10] टोनी होरे की संचार अनुक्रमिक प्रक्रियाओं का संचार करना (सीएसपी) में मैकिलॉय के पाइपों को और अधिक विकसित किया गया है।[11] एप्पल कंप्यूटर स्वचालक (सॉफ्टवेयर) के आइकन में रोबोट, जो पुनरावृत्ति किये जाने वाले आदेशों को साथ में श्रृंखलाबद्ध करने के लिए पाइपलाइन अवधारणा का भी उपयोग करता है, मूल यूनिक्स अवधारणा के सम्मान में पाइप रखता है I
अन्य परिचालन सिस्टम
यूनिक्स की इस विशेषता को अन्य परिचालन प्रणाली, जैसे एमएस-डॉस और वीएम/सीएमएस और एमवीएस पर सीएमएस पाइपलाइन पैकेज द्वारा उधार लिया गया था, और अंततः सॉफ्टवेयर इंजीनियरिंग की पाइपलाइन (सॉफ्टवेयर) के रूप में नामित किया गया है।
यह भी देखें
- प्रत्येक चीज़ फाइल है - यूनिक्स की परिभाषित विशेषताओं में से एक का वर्णन करता है; यूनिक्स अर्थ में पाइपलाइनें "फ़ाइलों" पर कार्य करती हैं I
- अनाम पाइप - फीफो संरचना जिसका उपयोग अंतरप्रक्रिया संचार के लिए किया जाता है
- जीस्ट्रीमर - पाइपलाइन आधारित मल्टीमीडिया ढांचा
- सीएमएस पाइपलाइन
- पुनरावृति
- नामित पाइप - अंतरप्रक्रिया संचार के लिए उपयोग किए जाने वाले दृढ़ पाइप
- प्रक्रिया प्रतिस्थापन - प्रक्रिया में कई पाइपों को जोड़ने के लिए शेल सिंटैक्स
- जीएनयू समानांतर
- पाइपलाइन (कंप्यूटिंग) - कंप्यूटर से संबंधित अन्य पाइपलाइन
- पुनर्निर्देशन (कंप्यूटिंग)
- टी (कमांड) - पाइपलाइन से डेटा टैप करने के लिए सामान्य कमांड
- एक्सएमएल पाइपलाइन - एक्सएमएल फाइलों के प्रसंस्करण के लिए
- ज़र्ग
संदर्भ
- ↑ Mahoney, Michael S. "The Unix Oral History Project: Release.0, The Beginning".
McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.
- ↑ "भविष्यवाणी पेट्रोग्लिफ्स". cm.bell-labs.com. Archived from the original on 8 May 1999. Retrieved 22 May 2022.
- ↑ "बैश रिलीज नोट्स". tiswww.case.edu. Retrieved 2017-06-14.
- ↑ "SSH के साथ शेल लूप इंटरेक्शन". 6 March 2012. Archived from the original on 6 March 2012.
- ↑ John1024. "मैं बैश में एक सरणी के रूप में "ढूंढें" कमांड परिणामों को कैसे संग्रहीत कर सकता हूं". Stack Overflow.
- ↑ "UNIX ऑपरेटिंग सिस्टम का निर्माण". Bell Labs. Archived from the original on September 14, 2004.
- ↑ 7.0 7.1 McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
- ↑ http://www.linfo.org/pipe.html Pipes: A Brief Introduction by The Linux Information Project (LINFO)
- ↑ http://www.cs.rit.edu/~swm/history/DTSS.doc[bare URL DOX/DOCX file]
- ↑ "आंकड़े". cm.bell-labs.com. Archived from the original on 20 February 1999. Retrieved 22 May 2022.
- ↑ https://swtch.com/~rsc/thread/ Bell Labs and CSP Threads (Russ Cox)
- Sal Soghoian on MacBreak Episode 3 "Enter the Automatrix"
बाहरी संबंध
- History of Unix pipe notation Archived 2015-04-08 at the Wayback Machine
- Doug McIlroy’s original 1964 memo, proposing the concept of a pipe for the first time
- The Single UNIX Specification, Version 4 from The Open Group : create an interprocess channel – System Interfaces Reference,
- Pipes: A Brief Introduction by The Linux Information Project (LINFO)
- Unix Pipes – powerful and elegant programming paradigm (Softpanorama)
- Ad Hoc Data Analysis From The Unix Command Line at Wikibooks – Shows how to use pipelines composed of simple filters to do complex data analysis.
- Use And Abuse Of Pipes With Audio Data – Gives an introduction to using and abusing pipes with netcat, nettee and fifos to play audio across a network.
- stackoverflow.com – A Q&A about bash pipeline handling.