पाइपलाइन (यूनिक्स)
यूनिक्स जैसे कंप्यूटर ऑपरेटिंग प्रणाली में, पाइपलाइन संदेश मार्ग का उपयोग करके अंतर-प्रक्रिया संचार के लिए तंत्र होता है। पाइपलाइन उनकी मानक धाराओं द्वारा श्रृंखलाबद्ध प्रक्रिया (कंप्यूटिंग) का समूह है, जिससे प्रत्येक प्रक्रिया का आउटपुट पाठ (स्टडआउट) सीधे इनपुट (स्टडिन) के रूप में आगामी में पारित हो जाए। द्वितीय प्रक्रिया प्रारम्भ की जाती है क्योंकि प्रथम प्रक्रिया अभी भी निष्पादित हो रही है, और और उन्हें समवर्ती रूप से निष्पादित किया जाता है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
). वैकल्पिक रूप से, यदि नाली को किसी इनपुट को पढ़ने की आवश्यकता नहीं है stdin
कुछ उपयोगी करने के लिए, यह दिया जा सकता है < /dev/null
इनपुट के रूप में।
जैसा कि एक पाइप के सभी घटक समानांतर में चलते हैं, एक शेल आमतौर पर इसकी सामग्री को संभालने के लिए एक सबप्रोसेस (एक सबशेल) को फोर्क करता है, जिससे बाहरी शेल वातावरण में परिवर्तनशील परिवर्तनों को प्रसारित करना असंभव हो जाता है। इस समस्या का समाधान करने के लिए, पिपमिल को एक कमांड प्रतिस्थापन वाले दस्तावेज़ से फीड किया जा सकता है, जो सामग्री के माध्यम से मिलिंग से पहले पाइपलाइन के चलने का इंतजार करता है। वैकल्पिक रूप से, समानांतर निष्पादन के लिए नामित पाइप या प्रक्रिया प्रतिस्थापन का उपयोग किया जा सकता है। GNU बैश में भी a lastpipe
अंतिम पाइप घटक के लिए फोर्किंग को अक्षम करने का विकल्प।[5]
प्रोग्रामेटिक रूप से पाइपलाइन बनाना
कार्यक्रम नियंत्रण के तहत पाइपलाइनों का निर्माण किया जा सकता है। यूनिक्स pipe()
सिस्टम कॉल ऑपरेटिंग सिस्टम को एक नया अज्ञात पाइप ऑब्जेक्ट बनाने के लिए कहता है। इसके परिणामस्वरूप प्रक्रिया में दो नए, खुले फाइल डिस्क्रिप्टर होते हैं: पाइप का केवल-पढ़ने वाला अंत, और केवल-लिखने वाला अंत। पाइप के सिरे सामान्य, अनाम फ़ाइल डिस्क्रिप्टर प्रतीत होते हैं, सिवाय इसके कि उनमें खोज करने की कोई क्षमता नहीं है।
गतिरोध से बचने और समांतरता का फायदा उठाने के लिए, एक या अधिक नए पाइपों के साथ यूनिक्स प्रक्रिया आम तौर पर कॉल करेगी fork()
नई प्रक्रियाएँ बनाने के लिए। प्रत्येक प्रक्रिया तब पाइप के अंत (ओं) को बंद कर देगी जिसका उपयोग किसी भी डेटा का उत्पादन या उपभोग करने से पहले नहीं किया जाएगा। वैकल्पिक रूप से, एक प्रक्रिया नए pthreads बना सकती है और उनके बीच संवाद करने के लिए पाइप का उपयोग कर सकती है।
नामांकित पाइप का उपयोग करके भी बनाया जा सकता है mkfifo()
या mknod()
और फिर प्रोग्राम में इनपुट या आउटपुट फ़ाइल के रूप में प्रस्तुत किया जाता है, जैसा कि उन्हें लागू किया जाता है। वे बहु-पथ पाइपों को बनाने की अनुमति देते हैं, और विशेष रूप से प्रभावी होते हैं जब मानक त्रुटि पुनर्निर्देशन या के साथ संयुक्त होते हैं tee
.
कार्यान्वयन
अधिकांश यूनिक्स जैसी प्रणालियों में, एक पाइपलाइन की सभी प्रक्रियाएं एक ही समय में शुरू होती हैं, उनकी धाराएं उचित रूप से जुड़ी होती हैं, और मशीन पर चलने वाली अन्य सभी प्रक्रियाओं के साथ निर्धारण (कंप्यूटिंग) द्वारा प्रबंधित किया जाता है। इसका एक महत्वपूर्ण पहलू, यूनिक्स पाइप को अन्य पाइप कार्यान्वयन से अलग करना, बफ़र (कंप्यूटर विज्ञान) की अवधारणा है: उदाहरण के लिए एक भेजने वाला प्रोग्राम प्रति सेकंड 5000 बाइट उत्पन्न कर सकता है, और एक प्राप्त करने वाला प्रोग्राम केवल 100 बाइट प्रति सेकंड स्वीकार करने में सक्षम हो सकता है दूसरा, लेकिन कोई डेटा गुम नहीं हुआ है। इसके बजाय, भेजने वाले प्रोग्राम का आउटपुट बफर में रखा जाता है। जब प्राप्त करने वाला प्रोग्राम डेटा पढ़ने के लिए तैयार होता है, तो पाइपलाइन में अगला प्रोग्राम बफर से पढ़ता है। यदि बफ़र भरा हुआ है, तो प्रेषण कार्यक्रम को तब तक रोक दिया जाता है (अवरुद्ध) जब तक कि रिसीवर द्वारा बफ़र से कम से कम कुछ डेटा हटा नहीं दिया जाता है। लिनक्स में, बफर का आकार 65,536 बाइट्स (64KiB) है। bfr नामक एक खुला स्रोत तृतीय-पक्ष फ़िल्टर आवश्यकता पड़ने पर बड़े बफ़र प्रदान करने के लिए उपलब्ध है।
नेटवर्क पाइप
netcat और socat जैसे उपकरण पाइपों को TCP/IP इंटरनेट सॉकेट से जोड़ सकते हैं।
इतिहास
पाइपलाइन अवधारणा का आविष्कार डगलस मैक्लॉयय ने किया था[6] और पहले संस्करण 3 यूनिक्स के मैन पेजों में वर्णित है।[7] McIlroy ने देखा कि अधिकांश समय यूनिक्स खोल ने आउटपुट फ़ाइल को एक प्रोग्राम से दूसरे में इनपुट के रूप में पारित किया।
उनके विचारों को 1973 में लागू किया गया था जब (मैकइलरॉय ने लिखा था, एक बुखार भरी रात में) केन थॉम्पसन ने pipe()
संस्करण 3 यूनिक्स में शेल और कई उपयोगिताओं के लिए सिस्टम कॉल और पाइप। अगले दिन, मैक्लरॉय ने जारी रखा, एक-लाइनर्स का एक अविस्मरणीय तांडव देखा, क्योंकि हर कोई प्लंबिंग के उत्साह में शामिल हो गया। McIlroy भी थॉम्पसन को इसका श्रेय देता है |
अंकन, जिसने संस्करण 4 यूनिक्स में पाइप सिंटैक्स के विवरण को बहुत सरल बना दिया।[8][7]
हालांकि स्वतंत्र रूप से विकसित, यूनिक्स पाइप केन लोचनर द्वारा विकसित 'संचार फाइलों' से संबंधित हैं, और इससे पहले थे [9] 1960 के दशक में डार्टमाउथ टाइम शेयरिंग सिस्टम के लिए।[10] टोनी होरे में | टोनी होरे की अनुक्रमिक प्रक्रियाओं का संचार करना (CSP) मेक्लोरी के पाइपों को और विकसित किया गया है।[11] एप्पल कंप्यूटर के स्वचालक (सॉफ्टवेयर) के आइकन में रोबोट, जो एक साथ दोहराए जाने वाले आदेशों को श्रृंखलाबद्ध करने के लिए एक पाइपलाइन अवधारणा का भी उपयोग करता है, मूल यूनिक्स अवधारणा के लिए श्रद्धांजलि में एक पाइप रखता है।
अन्य ऑपरेटिंग सिस्टम
यूनिक्स की इस विशेषता को अन्य ऑपरेटिंग सिस्टम, जैसे MS-DOS और VM/CMS और MVS पर CMS पाइपलाइन पैकेज द्वारा उधार लिया गया था, और अंततः सॉफ्टवेयर इंजीनियरिंग की पाइपलाइन (सॉफ्टवेयर) के रूप में नामित किया गया।
यह भी देखें
- सब कुछ एक फाइल है - यूनिक्स की परिभाषित विशेषताओं में से एक का वर्णन करता है; पाइपलाइनें यूनिक्स अर्थ में फाइलों पर काम करती हैं
- बेनामी पाइप - इंटरप्रोसेस संचार के लिए उपयोग की जाने वाली एक फीफो संरचना
- जीस्ट्रीमर - एक पाइपलाइन आधारित मल्टीमीडिया ढांचा
- सीएमएस पाइपलाइन
- पुनरावृति
- नामित पाइप - इंटरप्रोसेस संचार के लिए उपयोग किए जाने वाले लगातार पाइप
- प्रक्रिया प्रतिस्थापन - एक प्रक्रिया में कई पाइपों को जोड़ने के लिए शेल सिंटैक्स
- जीएनयू समानांतर
- पाइपलाइन (कंप्यूटिंग) - कंप्यूटर से संबंधित अन्य पाइपलाइन
- पुनर्निर्देशन (कंप्यूटिंग)
- टी (कमांड) - पाइपलाइन से डेटा टैप करने के लिए एक सामान्य कमांड
- एक्सएमएल पाइपलाइन - एक्सएमएल फाइलों के प्रसंस्करण के लिए
- ज़र्ग
संदर्भ
- ↑ 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.