User Tools

Site Tools


unixmix:capitole:capitol-04
Differences

This shows you the differences between two versions of the page.

Link to this comparison view

unixmix:capitole:capitol-04 [2013/07/09 12:32]
alexef
unixmix:capitole:capitol-04 [2014/09/10 09:46] (current)
razvan [Afișare procese]
Line 1: Line 1:
 = Comunicare între resurse = = Comunicare între resurse =
  
-== Tutorial ==+[[https://docs.google.com/presentation/d/1ugVHI-t18A_9rTiPNCKgCgKF5tdrvvDwlSAQlNzvTwQ/pub?start=false&loop=false&delayms=3000|Slide-uri de prezentare]]
  
-Deschideți un terminal.+== Tutorial (1) ==
  
 === Descriptori de fișiere === === Descriptori de fișiere ===
Line 20: Line 20:
  
 * Rulați comanda ''yes a''.  * Rulați comanda ''yes a''. 
-** Într-un alt terminal rulați comanda ''ls  -l  /proc/$(pidof yes)/fd''.+** Într-un alt terminal rulați comanda ''ls  -l  /proc/`pidof yes`/fd''.
 *** Ce observați? *** Ce observați?
 <code>Intrare și ieșirile standard.</code> <code>Intrare și ieșirile standard.</code>
-** Opriți comanda. ''Ctrl-c''.+ 
 +* Opriți comanda
  
  
 ==== Redirecționarea output-ului ==== ==== Redirecționarea output-ului ====
  
-* Rulați comanda ''> my_out_file''.+* Rulați comanda ''echo > my_out_file''.
 ** Listați fișierele din directorul curent în format lung. ** Listați fișierele din directorul curent în format lung.
 <code>Este creat un fișier nou.</code> <code>Este creat un fișier nou.</code>
 *Rulați comanda ''yes > a''. *Rulați comanda ''yes > a''.
-** Într-un alt terminal rulați comanda ''ls  -l  /proc/$(pidof yes)/fd''.+** Într-un alt terminal rulați comanda ''ls  -l  /proc/`pidof yes`/fd''.
 *** Ce observați? *** Ce observați?
-** **Atenție!** Comanda yes scrie foarte mult text și este posibil ca dacă nu vă mișcați repede, spațiul de pe mașina virtuală să se ocupe. 
 *** Dacă se întâmplă acest lucru, ștergeți fișierul ''a'' și repetați task-ul. *** Dacă se întâmplă acest lucru, ștergeți fișierul ''a'' și repetați task-ul.
 <code>Ieșirea standard este redirecționată.</code> <code>Ieșirea standard este redirecționată.</code>
 +
 * Rulați comanda ''echo Text > a''. * Rulați comanda ''echo Text > a''.
 ** Afișați conținutul fișierului ''a''. ** Afișați conținutul fișierului ''a''.
Line 42: Line 43:
 *** Ce s-a întâmplat cu acesta? *** Ce s-a întâmplat cu acesta?
 <code>Fișierul a fost suprascris.</code> <code>Fișierul a fost suprascris.</code>
 +
 * Rulați comanda ''echo File <nowiki>>></nowiki> a''. * Rulați comanda ''echo File <nowiki>>></nowiki> a''.
 ** Afișați conținutul fișierului ''a''. ** Afișați conținutul fișierului ''a''.
Line 51: Line 53:
 <code>/dev/null este folosit pentru a redirecționa output-ul (a îl face să nu mai apară pe ecran) și a îi face drop. <code>/dev/null este folosit pentru a redirecționa output-ul (a îl face să nu mai apară pe ecran) și a îi face drop.
 Se evită practic scrierea acestuia într-un fișier care ocupă spațiu pe hard.</code> Se evită practic scrierea acestuia într-un fișier care ocupă spațiu pe hard.</code>
-* Rulați comanda ''ls  -l  /proc/$(pidof yes)/fd''.+ 
 +* Rulați comanda ''ls  -l  /proc/`pidof yes`/fd''.
 ** Ce observați? ** Ce observați?
 <code>Ieșirea standard este redirecționată spre /dev/null.</code> <code>Ieșirea standard este redirecționată spre /dev/null.</code>
Line 60: Line 63:
 ** Tastați ''thales'' apoi ''enter''. ** Tastați ''thales'' apoi ''enter''.
 *Ce face comanda ''echo $var''? *Ce face comanda ''echo $var''?
-<code>Comanda read citește de la tastatură text și îl salvează în variabila var.+<code>read citește de la tastatură text și îl salvează în variabila var.
 Comanda echo $var afișează conținutul variabilei. În acest caz afișează textul citit anterior.</code> Comanda echo $var afișează conținutul variabilei. În acest caz afișează textul citit anterior.</code>
 +
 * Afișați din nou conținutul fișierului ''a''. * Afișați din nou conținutul fișierului ''a''.
-* Rulați comanda ''read var < a''.+* Rulați comanda ''(read var< a''.
 ** ''a'' este fișierul de la task-ul anterior ** ''a'' este fișierul de la task-ul anterior
 * Rulați din nou comanda ''echo $var''. * Rulați din nou comanda ''echo $var''.
 ** Ce observați? ** Ce observați?
-<code>Comanda read nu a mai așteptat comenzi de la tastatură și a citit din fișierul a.</code>+<code>Comanda de citire nu a mai așteptat comenzi de la tastatură și a citit din fișierul a.</code>
  
 ==== Redirecționarea erorilor ==== ==== Redirecționarea erorilor ====
-*Rulați comanda ''ls > out''.+* Rulați comanda ''ls > out''.
 ** Afișați conținutul fișierului ''out''. ** Afișați conținutul fișierului ''out''.
 <code>Output-ul comenzii ls a fost redirecționat în fișierul out.</code> <code>Output-ul comenzii ls a fost redirecționat în fișierul out.</code>
 +
 * Rulați comanda ''reboot > out''. * Rulați comanda ''reboot > out''.
 ** Afișați conținutul fișierului ''out''. ** Afișați conținutul fișierului ''out''.
Line 79: Line 84:
 Se încearcă redirectarea output-ului în fișierul out, însă fișierul este suprascris și gol (deoarece nu se scrie nimic). Se încearcă redirectarea output-ului în fișierul out, însă fișierul este suprascris și gol (deoarece nu se scrie nimic).
 Pe ecran apare mesajul scris la stderr de eroare.</code> Pe ecran apare mesajul scris la stderr de eroare.</code>
-* Rulați comanda ''reboot 2> out''. +
-** Afișați conținutul fișierului ''out''. +
-*** Ce observați? +
-<code>Pe ecran nu mai apare eroarea. Aceasta a fost redirecționată în fișierul out.</code> +
-* Rulați comanda ''ls 2> out''. +
-*** Ce observați? +
-<code>Se încearcă redirecționarea erorilor în fișierul out. +
-Cum nu se produce nicio eroare, fișierul out o să fie gol, iar pe ecran o să apară output-ul comenzii ls.</code>+
 * Rulați comanda ''reboot &> out''. * Rulați comanda ''reboot &> out''.
 ** Afișați conținutul fișierului ''out''. ** Afișați conținutul fișierului ''out''.
 *** Ce observați? *** Ce observați?
 +<code>Pe ecran nu mai apare eroarea. Aceasta a fost redirecționată împreună cu ieșirea standard în fișierul out.</code>
 +
 * Rulați comanda ''ls &> out''. * Rulați comanda ''ls &> out''.
 ** Afișați conținutul fișierului ''out''. ** Afișați conținutul fișierului ''out''.
 *** Ce observați? *** Ce observați?
 <code>Operatorul redirecționează și standard output și standard error.</code> <code>Operatorul redirecționează și standard output și standard error.</code>
 +
 +* Rulați comanda ''(ls > /dev/tty) &> out''.
 +*** Ce observați?
 +<code>Se încearcă redirecționarea erorilor în fișierul out.
 +Cum nu se produce nicio eroare, fișierul out o să fie gol, iar pe ecran o să apară output-ul comenzii ls.</code>
 +
 +== Tutorial (2) ==
 === Pipe-uri cu nume === === Pipe-uri cu nume ===
  
Line 150: Line 157:
 <code>ls -l | wc -l <code>ls -l | wc -l
 wc -l: numără câte linii există în input-ul primit</code> wc -l: numără câte linii există în input-ul primit</code>
-=== Semnale === 
  
-* Rulați comanda ''yes a''. 
-** Apăsați ''Ctrl-z''. 
-** Rulați ''jobs''. 
-*** Ce observați? 
-<code>Procesul a fosst suspendat</code> 
-* Rulați comanda ''fg''. 
-** Apăsați ''Ctrl-c''. 
-*** Ce observați? 
-<code>Procesul a fost pornit în foreground. Interacțiunea cu acesta este permisă. 
-Ctrl-c omoară procesul.</code> 
-* Rulați comanda ''yes bored''. 
-** Deschideți un alt terminal. Aflați ''PID-ul'' procesului. 
-* Rulați comanda ''kill -STOP $PID'', unde $PID este ''PID''-ul aflat anterior 
-** Ce observați că s-a întâmplat cu procesul ''yes''? 
-<code>Procesul a fost suspendat. Similar cu Ctrl-z</code> 
-* Rulați comanda ''kill -l''. 
-** Repetați experimentul și înlocuiți ''STOP'' cu numărul corespunzător aflat. 
-*** Pentru al doilea experiement, evident ''PID-ul'' nu va mai fi același. 
-<code>Același lucru.</code> 
-În momentul în care un terminal este închis, acesta transmite tuturor proceselor copil semnalul ''SIGHUP''.  
 == Exerciții == == Exerciții ==
  
Line 182: Line 168:
 ** hint: SIGHUP ** hint: SIGHUP
 ** ''man bash'' și /trap ** ''man bash'' și /trap
 +
 +== Recapitulare ==
 +
 +=== Afișare procese ===
 +
 +Dorim să afișăm anumite procese într-o anumită ordine.
 +
 +Folosiți ''ps'' cu opțiunea corectă pentru a afișa procesele care aparțin utilizatorului ''student''. Căutați în pagina de manual după șirul //user//.
 +
 +Pentru procesele de mai sus afișați PID-ul, comanda completă (cale completă cu parametri), timpul de rulare pe procesor, memoria RAM consumată (RSS -- //resident set size//). Pentru a selecta doar anumite atribute ale unui proces folosiți comanda ''ps'' cu parametrul ''-o'' urmat de opțiunile specifice; urmăriți și pagina de manual.
 +
 +Sortați procesele de mai sus în ordinea inversă a memoriei RAM consumate (RSS -- //resident set size//). Adică cele mai consumatoare de memorie procese la început.
 +
 +Din procesele sortate rețineți doar primele 10 intrări. Să afișați și antetul oferit de ''ps''.
 +
 +=== Procesele unui utilizator ===
 +
 +Dorim să lucrăm cu grupuri de procese care țin de un utilizator.
 +
 +Pe un tab nou de terminal adăugăm utilizatorul ''ana'' folosind comenzile<code>
 +$ sudo su
 +# adduser ana
 +[...]
 +# exit            # sau puteti folosi combinatia de taste Ctrl+d
 +$
 +</code>
 +
 +În acel tab nou ne autentificăm ca utilizatorul ''ana'' folosind comanda<code>
 +$ su - ana
 +</code>
 +
 +În cel nou tab, din contul utilizatorului ''ana'', porniți în background mai multe procese: ''sleep'', ''emacs'', ''gedit''.
 +
 +Din primul tab, folosiți, ca ''root'', ''pkill'' pentru o încheia execuția proceselor utilizatorului ''ana''; adică rulați ''sudo pkill ...'' (cu ce opțiuni sunt utile). Este posibil să fie necesar să folosiți semnalul ''SIGKILL'' ca să fie garantată încheierea execuției.
 +
 +=== Procesele unui terminal ===
 +
 +Pe un tab nou de terminal porniți în background procese ca utilizatorul ''root'', ''student'' și ''ana''.
 +
 +În acel tab aflăm care este identificatorul terminalului curent folosind comanda<code>
 +$ tty
 +</code>
 +
 +Din primul tab, folosiți, ca ''root'', ''pkill'' pentru o încheia execuția proceselor de pe al doilea terminal; adică rulați ''sudo pkill ...'' (cu ce opțiuni sunt utile). Este posibil să fie necesar să folosiți semnalul ''SIGKILL'' ca să fie garantată încheierea execuției.
 +
 +=== Procese detașate de terminal ===
 +
 +Sunt cazuri în care dorim să pornim procese detașate de terminal. Adică după pornirea procesului să închidem terminalul și procesul să nu fie "omorât" ci să își încheie execuția. Aceste procese sunt echivalente unor procese daemon.
 +
 +Pentru a detașa un proces de un terminal se folosesc comenzi precum ''nohup'', ''dtach'' și ''disown''.
 +
 +Folosiți comanda ''wget'' pentru a descărca fișierul ''.torrent'' de [[http://swarm.cs.pub.ro/~razvan/lin-prog.torrent|aici]].
 +
 +==== disown ====
 +
 +Porniți un proces ''BitTorrent'' folosind comanda:<code>
 +btdownloadheadless lin-prog.torrent
 +</code>
 +
 +Transferați procesul pornit în starea de rulare în background. Detașați procesul de terminal folosind comanda ''disown''. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda ''lsof'' pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
 +
 +Apoi încheiați execuția acelui proces.
 +
 +==== nohup ====
 +
 +Creați un proces BitTorrent precum cel de mai sus, detașat de terminal, folosind comanda ''nohup''. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda ''lsof'' pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
unixmix/capitole/capitol-04.1373362343.txt.gz · Last modified: 2013/07/09 12:32 by alexef