User Tools

Site Tools


linux-admin:capitole:capitol-07

This is an old revision of the document!


7. Redirectări

Redirectarile sunt principalul mijloc prin care stocam pe disc, in fisiere, prelucrarile de date facute de scripturi si programe.

Subiecte abordate

  • STDOUT (1)
  • STDERR (2)
  • STDIN (0)

Resurse utile

Exerciții

Demo-uri

Lucrul cu redirectari

Redirectare stdout (standard output, în general mesaje afișate prin comenzi similare cu printf din C). De exemplu, într-un sistem în care avem multe procese, e greu sa urmărim direct în consolă output-ul comenzii ps:

training@box:~$ ps -f -u student > stdout.txt 
training@box:~$ cat stdout.txt

Putem redirecta doar mesajele de eroare către un fișier. Scenariu: Vrem să găsim toate fișierele cu extensia *.conf din directorul /etc.

training@box:~$ find /etc -name '*.conf'
(...)
find: `/etc/ppp/peers': Permission denied
(...)

Ne deranjează mesajele de eroare din cauza lipsei drepturilor de citire asupra unor fișiere sau directoare. Pentru aceasta vom folosi:

training@box:~$ find /etc -name '*.conf' 2> errors.txt
training@box:~$ cat errors.txt

Putem face combinații acum: redirectăm erorile într-un fișier și rezultatele în alt fișier:

training@box:~$ find /etc -name '*.conf' 2> errors.txt > stdout.txt

În cazul în care dorim să redirecționăm toate mesajele afișate de o comandă, la grămadă, folosim operatorul &>:

training@box:~$ find /etc -name '*.conf' &> find_output.txt

Reamintiți-vă de la procese procfs, montat în /proc. Pentru fiecare proces identificat printr-un PID, aveam directorul /proc/19827/fd, care conținea link-uri simbolice către fișierele deschise de acel proces. Pentru fiecare proces în acel director găseam 0, 1, 2. Acestea reprezintă respectiv:

  • 0 - intrarea standard (stdin). Exemplu: tastatura
  • 1 - ieșirea standard (stdout). Exemplu: mesaje afișate cu printf de un program C
  • 2 - ieșirea standard de eroare (stderr), unde se duc mesaje precum cele afișate de find mai sus.

Putem redirecta outputul și către device-uri virtuale, cum ar fi /dev/null. În general facem acest lucru deoarece vrem să executăm o anumită comandă (într-un program sau într-un script), fără a ne interesa outputul ei. Pentru exemplul cu find de mai sus, să zicem că dorim să ignorăm erorile:

training@box:~$ find /etc -name '*.conf' 2> /dev/null 

Atenție! Toți operatorii de redirectare din acest demo 2>, &>, > trunchiază conținutul fișierului, dacă acesta exista. Ca alternativă aveam append mode, care se poate aplica și aici, fără probleme, astfel: 2>>, &>>, >>.

Investigarea redirectărilor

Putem folosi lsof pentru a verifica modul în care redirectarea afectează descriptorii unui proces.

Într-un tab de terminal porniți un proces sleep folosind comanda: sleep 100.

În alt tab, pentru a investiga descriptorii procesului sleep folosim comanda lsof -p $(pidof sleep).

Observăm că descriptorii standard referă terminalul în care a fost rulată comanda, moșteniți de la terminalul din shell-ul folosit.

Acum să invesigăm procesul sleep cu redictări în diverse fișiere. Folosiți comanda sleep 100 < /dev/zero > /dev/null 2> error.txt

Folosim comanda lsof anterioară pentru a investiga descriptorii procesului sleep. Putem observa unde pointează descriptorii standard de fișier pentru procesul pornit.

Exercițiu 1

De multe ori dorim să căutăm într-o ierarhie de fișiere și directoare, dar după anumite criterii. Comanda cea mai potrivită în acest caz este find. Folosiți find pentru a afișa toate fișierele din ierarhia /etc/ (adică toate fișierele din /etc/, din subdirectoarele acestuia, din subdirectoarele subdirectoarelor etc.). Hint: Folosiți opțiunea -type a comenzii find.

Extindeți comanda anterioară pentru a afișa toate fișierele din ierarhia /etc/ al căror nume începe cu litere între a și d. Hint: Folosiți opțiunea -name a comenzii find și construcția [a-d]* pentru a indica un șir care începe cu o literă între a și d urmată de orice altceva.

Extindeți comanda anterioară pentru a afișa toate fișierele din ierahia /etc/ care au permisiunile de forma rw-------, adică 600. Hint: Folosiți opțiunea -perm urmată de permisiunile căutate în format octal.

Pentru comanda finală, redirectați outputul în fișierul ~/file_list.txt și erorile în ~/errors.txt.

Exercițiu 2

Schimbați directorul curent în directorul /home/training. Folosiți comanda echo pentru a afișa pe ecran textul al doilea exercițiu. Redirectați acest text într-un fișier numit ex2.txt.

Folosiți comanda echo pentru a adăuga textul e mai lung decat primul în fișierul ex2.txt, fără a șterge conținutul său.

Scriind comanda gcc fără niciun parametru, veți primi un mesaj de eroare. Redirectați acest mesaj de eroare folosind un operator de redirectare într-un fişier numit gcc_error.txt. Afișați conținutul fișierului pentru a confirma.

Redirectați ieșirea standard a comenzii strace -e open ls /lib în fișierul strace.out.

Redirectați ieșirea de eroare standard a comenzii strace -e open ls /lib în fișierul strace.err.

Redirectați atât ieșirea standard cât și ieșirea de eroare standard a comenzii strace -e open ls /lib în fișierul strace.both.

Filtrați (folosind grep libc) ieșirea standard a comenzii strace -e open ls /lib și apoi redirectați-o în strace-new.out iar ieșirea de eroare standard în strace-new.err.

Filtrați (folosind grep proc) ieșirea de eroare standard a comenzii strace -e open ls /lib și apoi redirectați-o în strace-newer.err iar ieșirea standard în /dev/null.

Adăugați output-ul generat la ieșirea de eroare standard și ieșirea standard a comenzii strace -e open ls /lib în fișierul strace.log. O nouă rulare a comenzii va conduce la adăugarea de informații la sfârșitul acestui fișier.

Folosiți utilitarul tee atât pentru a afișa la ieșirea standard cât și a scrie în fișierul free.txt ieșirea comenzii free. Scrierea în fișier trebuie făcută fără a suprascrie ce era deja scris. (Hint: man tee, append)

În directorul curent, căutați toate fișierele ce conțin strace în nume și ștergeți-le.

Explicați diferența de comportament între următoarele două comenzi:

cat / 2>&1 > error.txt
cat / > error.txt 2>&1
linux-admin/capitole/capitol-07.1475134714.txt.gz · Last modified: 2016/09/29 10:38 by mihaic