Folosind unix care este în interiorul conductei

Acest conținut face parte din seria: Utilizarea UNIX

Aveți grijă de articole noi din această serie.

Una dintre cele mai inteligente și cele mai puternice inovații din UNIX este shell-ul. Este mai eficient decât interfața grafică și vă permite să creați scripturi pentru a automatiza mai multe sarcini. Mai mult, cu ajutorul conductei de comenzi este posibil să se construiască programe improvizate direct pe linia de comandă. Conducta colectează comenzi în lanțuri, în care ieșirea standard a unei comenzi devine intrarea standard pentru următoarea comandă.







Abrevieri obișnuite
  • GUI: interfață grafică de utilizator

Dar transportorul are un dezavantaj serios: arată ca o cutie neagră. Când conectați două comenzi, singura indicație a progresului procesului este ieșirea generată de ultima comandă din secvență. Puteți introduce comanda tee în ordine. și, de asemenea, să observe creșterea fișierului de ieșire cu ajutorul coada. dar aceste soluții funcționează bine numai cu o singură aplicație în comandă, în caz contrar fluxurile standard de ieșire (stdout) și fluxurile standard de eroare (stderr) de diferite faze sunt amestecate. În plus, ambele soluții sunt indicatori brutați, care probabil nu vor arăta cât de mult este necesar de calcul în fiecare etapă.

Desigur, puteți rupe o serie complexă de comenzi în mai mulți pași separați, fiecare dintre care va genera propriul fișier de ieșire. De fapt, dacă doriți să verificați rezultatul lucrărilor pe fiecare interval, descompunerea este soluția ideală. Creați un script în care, la fiecare pas, să generați un fișier de date separat și să îl utilizați ca intrare pentru următorul pas etc. Ca rezultat, veți primi un fișier cu rezultatele finale. Cu toate acestea, această practică nu se potrivește naturii improvizatoare a liniei de comandă.

Ceea ce avem nevoie este un indicator al progresului sarcinii, care poate fi încorporat în linia de comandă pentru a măsura rata de date. În mod ideal, ar fi bine să utilizați acest indicator în mod repetat pentru a compara performanța la fiecare pas. Deoarece nu există limită la perfecțiune, ar fi frumos dacă ar fi un instrument open source care să funcționeze cu diferite variante UNIX, cum ar fi Linux® și Mac OS X.

Toate dorințele noastre sunt îndeplinite de programul Pipe Viewer (pv), scris de administratorul de sistem Andrew Wood și îmbunătățit în ultimii patru ani de mulți alți dezvoltatori. Acesta vă permite să priviți în interiorul liniei de comandă "conducte". După cum se spune în pagina de pornire a proiectului. pv "poate fi inserat într-o conductă între două procese pentru a obține o indicație vizuală a vitezei transferului de date între ele, cât timp a trecut și cât de aproape este închiderea. Rețineți că pentru a măsura performanța relativă, puteți utiliza pv de mai multe ori în aceeași ordine de comandă.

Acest articol descrie cum se construiește un pv pentru sistemul dvs. UNIX și se aplică la combinații simple și complexe de instrumente de linie de comandă. Să începem cu o prezentare generală a modului în care procesele fac schimb de date între ele prin conducte.

Conducte UNIX: conducte pentru procese

Figura 1 prezintă pașii implicați în crearea unei conducte care conectează două procese independente.

Figura 1. Crearea unei conducte care conectează două procese

La început, în faza 1, procesul de inițiere citește datele de la stdin. imprimă rezultatul la stdout. dar erorile în stderr. stdin. stdout și stderr sunt descriptori de fișiere. Fiecare operație este realizată cu un descriptor de fișiere, de exemplu deschis. citește. scrie. înapoi. trunchiază sau închide. modifică starea fișierului.

Apoi, în faza 2, procesul inițiatorului creează o conductă. Conducta constă dintr-o coadă și două descriptori de fișiere. Unul este necesar pentru a pune datele în coadă, iar cealaltă este să le extragi din coadă. Conducta este o structură de date a tipului FIFO (primul-venit-primul-out).

Transportorul în sine este puțin folos; Acesta este conceput pentru a conecta procesul furnizorilor și procesul de consum (date). Prin urmare, procesul de inițiator din faza 3 se încadrează sau creează un proces cu care va lucra în perechi.

Fazele 1-4 ilustrează modul în care shell-ul conectează două utilitare cu ajutorul conductei (|) una la cealaltă în linia de comandă. Observăm doar că shell-ul creează un nou proces pentru fiecare utilitate, iar el însuși este responsabil pentru gestionarea progresului muncii.

De exemplu, Figura 2 arată cum puteți utiliza conductele pentru a conecta comenzile de căutare. grep și WC. pentru a găsi și de a număra numărul de fișiere ale căror nume încep cu un litere mici. Cochilia rămâne independentă; rezultatul de căutare servește ca flux de intrare pentru grep. rezultatul căruia, la rândul său, este trimis la comanda WC. wc procesează datele primite de la grep și afișează rezultatul muncii sale în stdout. În mod obișnuit, shell-ul trimite ieșiri către terminal, dar poate fi, de asemenea, redirecționat către un fișier.

Figura 2. Conectarea comenzilor utilizând conductele

Dacă doriți să studiați activitatea a două procese UNIX, creați două conducte și redefiniți descriptorii de fișiere ale proceselor, astfel încât să fie reciproc și furnizor și consumator de date. Figura 3 prezintă schimbul de date între procese, în care pentru ambele procese fluxurile stdin și stdout sunt redefinite.

Figura 3. Să explorăm două procese UNIX






Avem o scurtă trecere în revistă a conductelor, acum să ne familiarizăm cu utilitarul Viewer Pipe.

Viewer pentru țevi: un transportor remarcabil

Pipe Viewer este o aplicație open source. Puteți să-i descărcați codul și să construiți aplicația de la zero sau să încărcați executabilul programului din depozitul distribuției dvs. UNIX, dacă este acolo.

Listarea 1. Codul de instalare al tubului de vizualizare

Pentru a descărca fișierul executabil al programului pv din depozit, găsiți pachetele disponibile utilizând vizualizatorul pv sau pipe utilizând managerul de pachete al distribuției. De exemplu, în Ubuntu 9, căutarea prin managerul de pachete APT produce următorul rezultat:

Descărcați și instalați pachetul utilizând managerul de pachete. În Ubuntu, acest lucru se face cu comanda apt-get install.

Acum, hai să încercăm pv în acțiune. În cea mai simplă formă de utilizare, pv poate înlocui utilitatea tradițională a pisicilor pentru a trece octeți într-un alt program și pentru a măsura performanța generală. De exemplu, puteți utiliza pv pentru a urmări o operație de compresie de lungă durată:

La pornire, pv afișează o bară de progres care afișează și actualizează continuu diferiți indicatori de progres. În general, pv de la stânga la dreapta afișează numărul de date prelucrate, timpul scurs, performanța în megaocteți pe secundă, precum și o reprezentare vizuală și numerică a cantității de lucrări efectuate și evaluarea timpului rămas. În exemplul de mai sus, sunt procesate 96,1 MB de 109 MB, iar restul de 13% din fișier vor dura aproximativ 9 secunde

Implicit, pv afișează toți indicatorii de stare, ale căror valori poate fi calculat. De exemplu, dacă datele de intrare pentru pv nu sunt un fișier și nu sunt specificate manual în mărimea exactă, bara de progres se mișcă de la stânga la dreapta pentru a afișa activitatea programului, dar pv nu poate determina procentajul lucrărilor efectuate. De exemplu:

În acest exemplu, comanda tar este executată pe mașina de la distanță. rezultatul căruia este trimis la sistemul local în fișierul projectx.tar. Deoarece pv nu poate calcula numărul total de octeți care trebuie transmiși, acesta arată performanța, timpul scurs și un indicator special care arată activitatea programului. Este un indicator mic ( <=> ), care se mută de la stânga la dreapta când datele sunt transferate.

Parametrul - wait așteaptă indicatorul de progres până când primul octet este recepționat. Aici, așteptați este utilă, deoarece comanda ssh vă poate solicita o parolă.

Puteți activa indicatorii la discreția dvs. prin specificarea semnelor cu nume de vorbire:

În această comandă, flagul octeților este utilizat pentru a afișa numărul de octeți transferați. De asemenea, există parametri - progres. --timer. --eta. --rate și --numeric. Dacă specificați unul sau mai mulți dintre acești parametri, toți indicatorii rămași (nespecificați) sunt opriți automat.

Există o altă utilizare simplă a pv. Parametrul -rate-limit poate limita lățimea de bandă. Acest parametru acceptă ca argumente un număr și un sufix care denotă unitatea de măsură. De exemplu, m indică numărul de megaocteți pe secundă:

Comanda anterioară dezactivează toți indicatorii (- quiet) și limitează lățimea de bandă la 1MB / s.

Utilizarea mai complexă a programului Pipe Viewer

Până în prezent, în exemplele noastre, a fost utilizată doar o singură instanță a aplicației Pipe Viewer, care a acționat ca furnizor sau consumator de date într-o pereche de echipe. Cu toate acestea, sunt posibile combinații mai complexe. Prin observarea anumitor condiții, puteți folosi mai multe instanțe ale pv pe aceeași linie de comandă. Mai exact, trebuie să utilizați opțiunea --name pentru a specifica un nume pentru fiecare instanță a pv și pentru a activa modul multiline cu opțiunea --cursor. Împreună, acești doi parametri creează o serie de indicatori numiți, câte un indicator per instanță (programe).

De exemplu, dorim să monitorizăm simultan și separat procesele de transmisie și comprimare a datelor. Atribuiți o instanță a PV a primei operații, iar una mai mult - a doua:

După introducerea parolei, vom vedea că Vizualizatorul de țevi arată un indicator de activitate pe două linii:

Prima linie cu ssh indică evoluția transferului de date. Al doilea rând marcat cu gzip arată evoluția compresiei datelor. Deoarece niciuna dintre echipe nu poate determina cantitatea de date în funcționarea lor, fiecare linie indică cantitatea de date transmise și indicatorul de activitate.

Dacă știți sau puteți evalua sau calcula cantitatea de date procesate printr-o operație, puteți utiliza parametrul -size. Prin adăugarea acestei opțiuni, veți obține mai multe informații în indicatorii de progres.

De exemplu, dacă vrem să urmărim progresul unei sarcini mari de arhivare, puteți utiliza și alte utilitare UNIX pentru a estima dimensiunea generală a fișierelor sursă. Utilitarul df poate afișa statistici pentru întreg sistemul de fișiere și du poate calcula mărimea ierarhiei fișierelor de adâncime arbitrară:

Aici secvența de comenzi du -sh work | cut -f1 dă dimensiunea totală a directorului de lucru într-un format compatibil cu pv. Comanda du -h generează date într-un format care poate fi citit, de exemplu 17M pentru 17 megabytes, care este potrivit pentru utilizare cu pv. (Comenzile ls și df acceptă, de asemenea, opțiunea -h pentru a transmite date într-un format care poate fi citit de om). Din moment ce pv se așteaptă ca un anumit număr de octeți să fie transmiși prin conductă, acesta va afișa un indicator de progres complet:

Și, în sfârșit, există o altă metodă care va fi cu siguranță folositoare pentru dvs. În plus față de octeții de numărare, Vizualizatorul de țevi poate vizualiza progresul operației prin numărarea liniilor de date. Dacă specificați modifier -line-mode. pv actualizează bara de progres de fiecare dată când se întâlnește o nouă linie. De asemenea, puteți specifica opțiunea -size. atunci numărul va fi interpretat ca numărul așteptat de rânduri.

Să luăm în considerare un exemplu. Comanda de căutare este adesea utilă atunci când trebuie să găsiți un ac într-o haystack, de exemplu, pentru a găsi toate locurile în care se utilizează un anumit apel sistem într-o mulțime de cod. În astfel de cazuri, puteți utiliza această comandă:

Acest cod găsește toate fișierele cu cod sursă în C și returnează numele fișierelor în care are loc șirul fopen. Rezultatul lucrării este trimis la un fișier numit rezultate. Pentru a reflecta activitatea, adăugați comanda pv.

Modul de șir este fenomenal, deoarece multe comenzi UNIX, de exemplu, găsesc. Ei operează pe metadatele fișierelor, nu pe conținutul lor. Modul de șir este ideal pentru scripturile de administrare a sistemului care copiază sau comprimă un număr mare de fișiere.

În general, programul Pipe Viewer poate fi introdus în linia de comandă și în scripturi ori de câte ori puteți măsura viteza de transfer de date. Uneori trebuie să fii creativ - de exemplu, pentru a măsura viteza de copiere a unui director, poți trece de la cp -pr la tar.

De asemenea, modul de șir poate fi utilizat atunci când lucrați cu utilitare de rețea, cum ar fi wget. curl și scp. De exemplu, puteți utiliza pv pentru a afișa executarea procesului de transferare a unei cantități cunoscute de date către o mașină de la distanță. Și, deoarece multe utilități de rețea pot citi intrări dintr-un fișier, puteți utiliza dimensiunea unui astfel de fișier ca argument pentru parametrul -size.

Un mic bijuterie

Pipe Viewer - aceasta este una dintre acele pietre puțin cunoscute, fără de care, după ce se familiarizeze cu ei o zi, nu mai este posibil să se facă. Puteți găsi mai multe moduri de a utiliza pv în munca dvs. de zi cu zi la linia de comandă, dar cel mai probabil veți găsi o mulțime de opțiuni pentru utilizarea în scripturi de automatizare. În loc de holbezi la cursor care clipește, așteptați cu răbdare pentru oricare dintre semnalul că totul merge bine, puteți pune senzorul pentru a obține informații cu privire la aplicarea în timp real. Vizualizarea pipe-ului vă permite să auziți bătăile inimii mașinii dvs.

Descărcați resurse

Subiecte conexe

  • Ul de promovare Tehnologie Web Design Webmasteri UNIX: Peering în țevi.
  • Aflați mai multe despre shell-urile UNIX.
  • Pe dezvoltatorWorks, în secțiunile AIX și UNIX, puteți găsi întotdeauna o cantitate uriașă de materiale de referință referitoare la toate aspectele legate de administrarea sistemelor AIX.
  • Aflați mai multe despre Pipe Viewer și descărcați-l.






Trimiteți-le prietenilor: