В Unix-подібних операційних системах конвеєр — це механізм міжпроцесної взаємодії, що використовує передачу повідомлень. Є набором поєднаних між собою процесів, які забезпечують передачу даних так, що стандартний вихідний потік кожного процесу (stdout) безпосередньо з'єднується зі стандартним вхідним потоком (stdin) наступного. Наступний процес починається, поки перший ще виконується і вони виконуються одночасно. Концепцію було запропоновано Дугласом Макілроєм в Bell Labs, колисці Unix, в процесі його розробки та формування філософії інструментизації. Назву дано за аналогією зі справжніми конвеєрами. Ключовою функцією цих конвеєрів є «приховування нутрощів» (Ritchie & Thompson, 1974). Це забезпечує системі чистоту за простоту.
У цій статті йдеться про неіменовані канали, де дані, повернені одним процесом, буферизуються системою, поки не будуть зчитані наступним процесом і цей односпрямований канал зникає з закінченням процесів. Це відрізняється від іменованих каналів, де повідомлення передаються між процесами файлами, які залишаються по закінченні процесів. Стандартний shell-синтаксис для неіменованих каналів — це список декількох команд, розділених вертикальними рисками («пайпи» в розмовній лексиці користувачів Unix):
command1 | command2 | command3
Наприклад, щоб отримати список файлів в поточній директорії, зберегти лише стрічку ls виводу, що має рядок "key" (grep) і показати результат на сторінці, що прогортується (less), користувач може написати в командний рядок терміналу наступне:
ls -l | grep key | less
Командаls -l
виконується як процес, вивід (stdout) якого передається вводу (stdin) процесу команди 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
виключає вивід стрічок, що є унікальними в другому файлі та однаковими в обох файлах, виводячи лише стрічки, унікальні для першого файлу.-
на місці назви файлу вказує процесуcomm
використовувати стандартний потік вводу (в даному випадку з конвеєра).sort /usr/share/dict/words
сортує вміст файлуwords
за алфавітом (за вимогами процесуcomm
).<( ... )
виводить результат виконання в тимчасовий файл (використовуючи процесне заміщення), який зчитуєcomm
. Результатом є список слів (стрічок), не знайдених в/usr/share/dict/words
less
дозволяє користувачеві розділити результат на сторінки і прогортувати їх.
Конвеєри в інтерфейсах командного рядка
Всі широко використовувані оболонки Unix мають власний синтаксис для створення конвеєрів. Загалом, команди пишуть послідовно, розділюючи їх вертикальною рискою ASCII |
(яку з цієї ж причини часто називають «пайпом»). Командна оболонка розпочинає процеси і організовує необхідні зв'язки між їхніми стандартними потоками, використовуючи деякий обсяг буферу.
Потік виводу помилок
За замовчуванням стандартні потоки виводу помилок («stderr») процесів в конвеєрі не передаються далі, натомість з'єднуються і направляються в консоль. Однак, багато оболонок мають додатковий синтаксис для зміни цих налаштувань. Наприклад, використання |&
замість |
в оболонці csh означає, що стандартний потік виводу помилок теж треба злити зі стандартним виводом і передати наступному процесу.
Канальні роздрібнювачі
У найпростіших та найпоширеніших конвеєрах, оболонка з'єднує серію підпроцесів каналами і виконує зовнішні команди безпосередньо в підпроцесі. Таким чином сама оболонка не виконує прямої обробки даних, що передаються каналом.
Однак, оболонка може напряму обробляти дані, використовуючи так звані канальні роздрібнювачі (оскільки команда 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
i ssh
, які потребують зчитування з stdin
: при першій його ітерації. Така програма (назвімо її стоком) зчитуватиме залишковий вивід з command
і цикл буде припинено (його результат залежатиме від специфіки стоку). Є декілька шляхів уникнення такого сценарію. По-перше, деякі стоки підтримують можливість вимкнення читання з stdin
(напр. ssh -n
). Як альтернатива, якщо стік не потребує вхідних даних з stdin
, щоб зробити щось корисне, вхідними даними може бути < /dev/null.
Оскільки всі складові каналу виконуються паралельно, оболонка типово розділяє підпроцес (підоболонку), щоб обробити його вміст, що унеможливлює поширення зміни змінної в зовнішню оболонку. Щоб виправити цю проблему, даний конструкт може прийняти значення з here-документу, що містить командне заміщення, яке очікує завершення конвеєру, перш ніж проходитись по даних. В альтернативу цьому, для розпаралелення можна використовувати іменовані канали або заміщення процесів. GNU bash також має варіант lastpipe
для вимкнення розділення останнього компоненту каналу.
Програмне створення конвеєрів
Конвеєри можуть бути створені програмно. Системний виклик в Unix pipe()
просить операційну систему побудувати новий об'єкт неіменованого каналу. Результатом є відкриті два нові файлові дескриптори процесу: один лише для читання, другий лише для запису. Вони схожі зі звичайними неіменованими файловими дескрипторами, але в них немає можливості пошуку.
Щоб уникнути взаємного блокування та використати розпаралелення, Unix процес з одним або більше новим каналом викликає fork()
, щоб створити нові процеси.
Іменовані канали теж можна створити командою mkfifo()
або [en]()
.
Виконання
В більшості Unix-подібних системах всі процеси конвеєра починаються одночасно. Їхні потоки повинні бути відповідно правильно під'єднані і організовані планувальником разом з іншими процесами, що виконуються машиною. Важливим аспектом цього є наступне: відділяти Unix канали від інших каналів, що виконуються, є концептом буферингу. Наприклад, програма-відправник може генерувати 5000 байтів на секунду, а програма-отримувач може отримувати лише 100 байтів на секунду, але при цьому дані не втрачаються, а зберігаються в буфері. Коли отримувач готовий приймати дані, наступний процес конвеєру зчитує їх з буферу. Якщо він заповнений, програма-відправник блокується, поки певний об'єм даних не переміститься з буферу до отримувача. В Лінуксі розмір буферу складає 65546 байтів (64КБ). У відкритих джерелах можна знайти сторонній фільтр bfr для забезпечення буферу більшого об'єму при потребі.
Історія
Дуглас Макілрой винайшов концепт конвеєру і вперше описав його в посібнику для Version 3 Unix. Макілрой помітив, що дуже часто командні оболонки передавали вихідні дані однієї програми на вхід іншій.
Його ідеї були втілені в 1973 році, коли Кен Томпсон додав системний виклик pipe()
і канали до оболонки і декількох утиліт Version 3 Unix. Позначення |
— також заслуга Томпсона, це значно полегшило опис синтаксису у Version 4.
Диф. також
Посилання
- Mahoney, Michael S. . Архів оригіналу за 21 квітня 2021. Процитовано 14 січня 2022.
McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.
- . Архів оригіналу за 3 лютого 2015. Процитовано 14 січня 2022.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - . 6 березня 2012. Архів оригіналу за 6 березня 2012.
- John1024. How can I store the "find" command results as an array in Bash. Stack Overflow.
- . Bell Labs. Архів оригіналу за 14 вересня 2004.
- McIlroy, M. D. (1987). (PDF) (Технічний звіт). CSTR. № 139. Bell Labs. Архів оригіналу (PDF) за 11 листопада 2017. Процитовано 14 січня 2022.
- http://www.linfo.org/pipe.html [ 26 червня 2020 у Wayback Machine.] Pipes: A Brief Introduction by The Linux Information Project (LINFO)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V Unix podibnih operacijnih sistemah konveyer ce mehanizm mizhprocesnoyi vzayemodiyi sho vikoristovuye peredachu povidomlen Ye naborom poyednanih mizh soboyu procesiv yaki zabezpechuyut peredachu danih tak sho standartnij vihidnij potik kozhnogo procesu stdout bezposeredno z yednuyetsya zi standartnim vhidnim potokom stdin nastupnogo Nastupnij proces pochinayetsya poki pershij she vikonuyetsya i voni vikonuyutsya odnochasno Koncepciyu bulo zaproponovano Duglasom Makilroyem v Bell Labs kolisci Unix v procesi jogo rozrobki ta formuvannya filosofiyi instrumentizaciyi Nazvu dano za analogiyeyu zi spravzhnimi konveyerami Klyuchovoyu funkciyeyu cih konveyeriv ye prihovuvannya nutroshiv Ritchie amp Thompson 1974 Ce zabezpechuye sistemi chistotu za prostotu Konveyer z troh programnih procesiv vikonuvana z tekstovogo terminalu U cij statti jdetsya pro neimenovani kanali de dani poverneni odnim procesom buferizuyutsya sistemoyu poki ne budut zchitani nastupnim procesom i cej odnospryamovanij kanal znikaye z zakinchennyam procesiv Ce vidriznyayetsya vid imenovanih kanaliv de povidomlennya peredayutsya mizh procesami fajlami yaki zalishayutsya po zakinchenni procesiv Standartnij shell sintaksis dlya neimenovanih kanaliv ce spisok dekilkoh komand rozdilenih vertikalnimi riskami pajpi v rozmovnij leksici koristuvachiv Unix command1 command2 command3 Napriklad shob otrimati spisok fajliv v potochnij direktoriyi zberegti lishe strichku ls vivodu sho maye ryadok key grep i pokazati rezultat na storinci sho progortuyetsya less koristuvach mozhe napisati v komandnij ryadok terminalu nastupne ls l grep key less Komandals l vikonuyetsya yak proces vivid stdout yakogo peredayetsya vvodu stdin procesu komandi grep key tak samo z komandoyu less Kozhen proces prijmaye vvid vid poperednogo i peredaye svij vivid nastupnomu standartnimi potokami Kozhen vkazuye komandnij obolonci pid yednati standartnij vivid komandi zliva do standartnogo vvodu komandi sprava cherez mehanizm vzayemodiyi mizh procesami sho nazivayut neimenovanim kanalom vbudovanim v operacijnu sistemu Kanali ye odnostoronnimi dani perehodyat kanalom lishe zliva napravo PrikladiNizhche navedenij priklad konveyera sho realizovuye perevirku orfografiyi dlya veb storinki na yaku vkazuye posilannya 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 lt sort usr share dict words less a href wiki CURL title CURL curl a otrimuye html vmist vebstorinki dlya deyakih sistem vikoristovuyut wget a href wiki Sed title Sed sed a zaminyuye vsi simvoli z vmistu vebstorinki sho ne ye probilami chi literami na probili zi zberezhennyam perehodu na novij ryadok a href wiki Tr title Tr tr a zminyuye vsi veliki literi na mali i konvertuye probili u perehodi na novij ryadok kozhne slovo teper v okremomu ryadku a href wiki Grep title Grep grep a prijmaye lishe ti ryadki yaki mistyat shonajmenshe odnu malu literu alfavitu takim chinom viklyuchayuchi pusti ryadki a href wiki Sort title Sort sort a sortuye spisok sliv v alfavitnomu poryadku a u vidalyaye dublikati a href wiki Comm title Comm comm a shukaye strichki sho ye odnakovimi v obidvoh fajlah 23viklyuchaye vivid strichok sho ye unikalnimi v drugomu fajli ta odnakovimi v oboh fajlah vivodyachi lishe strichki unikalni dlya pershogo fajlu na misci nazvi fajlu vkazuye procesu comm vikoristovuvati standartnij potik vvodu v danomu vipadku z konveyera sort usr share dict words sortuye vmist fajlu words za alfavitom za vimogami procesu comm lt vivodit rezultat vikonannya v timchasovij fajl vikoristovuyuchi procesne zamishennya yakij zchituye comm Rezultatom ye spisok sliv strichok ne znajdenih v usr share dict words a href wiki Less title Less less a dozvolyaye koristuvachevi rozdiliti rezultat na storinki i progortuvati yih Konveyeri v interfejsah komandnogo ryadkaVsi shiroko vikoristovuvani obolonki Unix mayut vlasnij sintaksis dlya stvorennya konveyeriv Zagalom komandi pishut poslidovno rozdilyuyuchi yih vertikalnoyu riskoyu ASCII yaku z ciyeyi zh prichini chasto nazivayut pajpom Komandna obolonka rozpochinaye procesi i organizovuye neobhidni zv yazki mizh yihnimi standartnimi potokami vikoristovuyuchi deyakij obsyag buferu Potik vivodu pomilok Za zamovchuvannyam standartni potoki vivodu pomilok stderr procesiv v konveyeri ne peredayutsya dali natomist z yednuyutsya i napravlyayutsya v konsol Odnak bagato obolonok mayut dodatkovij sintaksis dlya zmini cih nalashtuvan Napriklad vikoristannya amp zamist v obolonci csh oznachaye sho standartnij potik vivodu pomilok tezh treba zliti zi standartnim vivodom i peredati nastupnomu procesu Kanalni rozdribnyuvachi U najprostishih ta najposhirenishih konveyerah obolonka z yednuye seriyu pidprocesiv kanalami i vikonuye zovnishni komandi bezposeredno v pidprocesi Takim chinom sama obolonka ne vikonuye pryamoyi obrobki danih sho peredayutsya kanalom Odnak obolonka mozhe napryamu obroblyati dani vikoristovuyuchi tak zvani kanalni rozdribnyuvachi oskilki komanda while rozdibnyuye rezultati z pochatkovoyi komandi i prohoditsya po kozhnomu z nih Zagalnij viglyad takogo konstruktu viglyadaye nastupnim chinom 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 Taki konstrukti mozhut vikonuvatis nekorektno yaksho tilo ciklu mistit taki komandi yak cat i ssh yaki potrebuyut zchituvannya z a href wiki Stdin class mw redirect title Stdin stdin a pri pershij jogo iteraciyi Taka programa nazvimo yiyi stokom zchituvatime zalishkovij vivid z command i cikl bude pripineno jogo rezultat zalezhatime vid specifiki stoku Ye dekilka shlyahiv uniknennya takogo scenariyu Po pershe deyaki stoki pidtrimuyut mozhlivist vimknennya chitannya z stdin napr ssh n Yak alternativa yaksho stik ne potrebuye vhidnih danih z stdin shob zrobiti shos korisne vhidnimi danimi mozhe buti lt dev null Oskilki vsi skladovi kanalu vikonuyutsya paralelno obolonka tipovo rozdilyaye pidproces pidobolonku shob obrobiti jogo vmist sho unemozhlivlyuye poshirennya zmini zminnoyi v zovnishnyu obolonku Shob vipraviti cyu problemu danij konstrukt mozhe prijnyati znachennya z here dokumentu sho mistit komandne zamishennya yake ochikuye zavershennya konveyeru persh nizh prohoditis po danih V alternativu comu dlya rozparalelennya mozhna vikoristovuvati imenovani kanali abo zamishennya procesiv GNU bash takozh maye variant lastpipe dlya vimknennya rozdilennya ostannogo komponentu kanalu Programne stvorennya konveyerivKonveyeri mozhut buti stvoreni programno Sistemnij viklik v Unix pipe prosit operacijnu sistemu pobuduvati novij ob yekt neimenovanogo kanalu Rezultatom ye vidkriti dva novi fajlovi deskriptori procesu odin lishe dlya chitannya drugij lishe dlya zapisu Voni shozhi zi zvichajnimi neimenovanimi fajlovimi deskriptorami ale v nih nemaye mozhlivosti poshuku Shob uniknuti vzayemnogo blokuvannya ta vikoristati rozparalelennya Unix proces z odnim abo bilshe novim kanalom viklikaye a href wiki Fork D1 81 D0 B8 D1 81 D1 82 D0 B5 D0 BC D0 BD D0 B8 D0 B9 D0 B2 D0 B8 D0 BA D0 BB D0 B8 D0 BA title Fork sistemnij viklik fork a shob stvoriti novi procesi Imenovani kanali tezh mozhna stvoriti komandoyu mkfifo abo sup class noprint span title mknod versiya statti mknod anglijskoyu movoyu style font style normal font weight normal font size normal en span sup VikonannyaV bilshosti Unix podibnih sistemah vsi procesi konveyera pochinayutsya odnochasno Yihni potoki povinni buti vidpovidno pravilno pid yednani i organizovani planuvalnikom razom z inshimi procesami sho vikonuyutsya mashinoyu Vazhlivim aspektom cogo ye nastupne viddilyati Unix kanali vid inshih kanaliv sho vikonuyutsya ye konceptom buferingu Napriklad programa vidpravnik mozhe generuvati 5000 bajtiv na sekundu a programa otrimuvach mozhe otrimuvati lishe 100 bajtiv na sekundu ale pri comu dani ne vtrachayutsya a zberigayutsya v buferi Koli otrimuvach gotovij prijmati dani nastupnij proces konveyeru zchituye yih z buferu Yaksho vin zapovnenij programa vidpravnik blokuyetsya poki pevnij ob yem danih ne peremistitsya z buferu do otrimuvacha V Linuksi rozmir buferu skladaye 65546 bajtiv 64KB U vidkritih dzherelah mozhna znajti storonnij filtr bfr dlya zabezpechennya buferu bilshogo ob yemu pri potrebi IstoriyaDuglas Makilroj vinajshov koncept konveyeru i vpershe opisav jogo v posibniku dlya Version 3 Unix Makilroj pomitiv sho duzhe chasto komandni obolonki peredavali vihidni dani odniyeyi programi na vhid inshij Jogo ideyi buli vtileni v 1973 roci koli Ken Tompson dodav sistemnij viklik pipe i kanali do obolonki i dekilkoh utilit Version 3 Unix Poznachennya takozh zasluga Tompsona ce znachno polegshilo opis sintaksisu u Version 4 Dif takozhNeimenovanij kanal Imenovanij kanal Procesne zamishennya TeePosilannyaMahoney Michael S Arhiv originalu za 21 kvitnya 2021 Procitovano 14 sichnya 2022 McIlroy It was one of the only places where I very nearly exerted managerial control over Unix was pushing for those things yes Arhiv originalu za 3 lyutogo 2015 Procitovano 14 sichnya 2022 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya 6 bereznya 2012 Arhiv originalu za 6 bereznya 2012 John1024 How can I store the find command results as an array in Bash Stack Overflow Bell Labs Arhiv originalu za 14 veresnya 2004 McIlroy M D 1987 PDF Tehnichnij zvit CSTR 139 Bell Labs Arhiv originalu PDF za 11 listopada 2017 Procitovano 14 sichnya 2022 http www linfo org pipe html 26 chervnya 2020 u Wayback Machine Pipes A Brief Introduction by The Linux Information Project LINFO