Differences

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

Link to this comparison view

sde:laboratoare:05_ro_procese [2020/03/17 16:50]
ioana_maria.culic
— (current)
Line 1: Line 1:
-=====Înainte de laborator===== 
- 
-==== Utilizare terminal ==== 
- 
-Pentru a deschide un terminal nou: 
- 
-^ Scurtătură ​            ^ Descriere ​                                         ^ 
-| **''​Ctrl+Alt+t''​** ​  | pentru a deschide o nouă fereastră de terminal ​             | 
- 
-Puteți folosi următoarele scurtături în terminal: 
- 
-^ Scurtătură ​            ^ Descriere ​                                         ^ 
-| **''​Ctrl+Shift+t''​** ​  | pentru a deschide un nou tab                       | 
-| **''​Ctrl+PageDown''​** ​ | pentru a merge la tab-ul următor ​                  | 
-| **''​Ctrl+PageUp''​** ​   | pentru a merge la tab-ul precedent ​                | 
-| **''​Alt+<​index>''​** ​   | pentru a sări direct la un tab                     | 
-| **''​Ctrl+d''​** ​        | pentru a închide un tab (sau comanda **''​exit''​**) | 
- 
-Pentru a naviga (scrolling) în cadrul unui terminal, mai ales atunci când o comandă afișează mult text, folosiți următoarele scurtături:​ 
- 
-^ Scurtătură ​          ^ Descriere ​              ^ 
-| **''​Shift+PgDown''​** | pentru a derula în jos  | 
-| **''​Shift+PgUp''​** ​  | pentru a derula în sus  | 
- 
-Alte scurtături utile: ​ 
- 
-^ Scurtătură ​          ^ Descriere ​              ^ 
-| **''​Ctrl+Shift+c''​** | copiere text din terminal ​ | 
-| **''​Ctrl+Shift+v''​** | lipire text în terminal | 
-| **''​Shift+Insert''​** | lipire text în terminal | 
- 
-==== Navigarea în paginile de manual ==== 
- 
-Paginile de manual sunt adesea de mari dimensiuni și avem nevoie să le parcurgem rapid (să navigăm prin ele). Pentru aceasta, după ce deschidem pagina de manual a unei comenzi, putem folosi combinațiile de taste de mai jos pentru a naviga în pagină: 
- 
-^ Tastă ​                                 ^ Scurtă descriere ​                                         ^ 
-| /​string_to_search ​                     | ''/''​ (adică tasta //slash//) e folosită pentru a căuta **''​string_to_search''​** în pagina de manual | 
-| **''​n''​** (next) ​                      | pentru a merge la următoarea apariție a cuvântului căutat cu / | 
-| **''​N''​** (Shift + n)                  | pentru a merge la precedenta apariție a cuvântului ​            | 
-| **''​q''​** (quit) ​                      | pentru a închide pagina de manual ​                             | 
-| **''​Enter''​** ​                         | pentru a derula în jos o linie                            | 
-| **''​f''​** (forward) sau **''​Space''​** ​ | pentru a derula în jos un ecran                           | 
-| **''​b''​** (backward) ​                  | pentru a derula în sus un ecran                           | 
-| **''​d''​** (down) ​                      | pentru a derula în jos jumătate de ecran                  | 
-| **''​u''​** (up)                         | pentru a derula în sus jumătate de ecran                  | 
- 
-==== Suport laborator ==== 
- 
-Pentru a obține informații detaliate despre noțiunile și tehnicile din acest laborator, recomandăm să consultați [[http://​elf.cs.pub.ro/​uso/​res/​carte/​uso_cap-04-process.pdf|capitolul corespunzător din cartea de USO]]. 
- 
-==== Obiective ==== 
- 
-  * Înțelegerea conceptelor legate de procese 
-  * Dobândirea de competențe de monitorizare și interacțiune cu procesele 
-  * Obținerea de abilități de lucru cu utilitare și comenzi Linux 
-  * Obținerea de noțiuni de bază legate de comunicarea inter-proces:​ pipe-uri și semnale 
-==== Pe scurt despre Git ==== 
- 
-Pe parcursul laboratoarelor,​ pentru descărcarea fișierelor necesare laboratorului,​ vom folosi Git. Git este un sistem de controlul versiunii și e folosit pentru versionarea codului în proiectele software mari. Celor interesați să aprofundeze conceptele din spatele comenzii ''​git'',​ precum și utilizări avansate, le recomandăm cursul practic online de pe [[http://​gitimmersion.com/​|gitimmersion]]. 
- 
-Informațiile despre laboratorul de USO se găsesc în [[https://​github.com/​systems-cs-pub-ro/​uso-lab|acest repository Git]]. 
- 
-<note important>​ 
-Pentru a pregăti infrastructura de laborator rulați comenzile de mai jos într-un terminal. Deschideți un terminal folosind combinația de taste ''​Ctrl+Alt+t''​. În listarea de mai jos ''​student@uso:​~$''​ este promptul unde introduceți comenzile, pe acela nu-l tastați. 
- 
-<​code>​ 
-student@uso:​~$ cd ~ 
-student@uso:​~$ git clone https://​github.com/​systems-cs-pub-ro/​uso-lab.git 
-</​code>​ 
- 
-</​note>​ 
- 
-Cam atât cu pregătirea laboratorului. Acum haideți să ne apucăm de treabă! :-) 
- 
-===== Concepte ===== 
- 
-==== Vizualizarea proceselor din sistem (ps, pstree, top, htop) ==== 
- 
-Ierarhia de procese în Linux este sub formă arborescentă;​ putem vizualiza folosind ''​pstree''​ (similar cu ''​tree''​ de la sistemul de fișiere) 
- 
-Folosind ''​ps''​ fără nici un parametru vizualizăm procesele din shell-ul curent asociate utilizatorului curent. 
- 
-<code bash> 
-student@uso:​~$ ps 
-  PID TTY          TIME CMD 
-22101 pts/0    00:00:00 bash 
-22209 pts/0    00:00:00 ps 
-</​code>​ 
- 
-Tot cu ''​ps''​ putem vizualiza un ''​snapshot''​ al tuturor proceselor. Aceasta se poate obține folosind două variante ale comenzii: 
- 
-<code bash> 
-student@uso:​~$ ps aux 
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
-root         ​1 ​ 0.0  0.3 160140 ​ 7044 ?        Ss   ​10:​39 ​  0:02 /sbin/init spla 
-root         ​2 ​ 0.0  0.0      0     0 ?        S    10:39   0:00 [kthreadd] 
-[...] 
-student ​ 22101  0.0  0.2  31236  5192 pts/0    Ss   ​19:​38 ​  0:00 bash 
-student ​ 22114  0.0  0.2  31236  5008 pts/1    Ss+  19:38   0:00 bash 
-root     ​22151 ​ 0.0  0.3  25656  6260 ?        S    19:40   0:00 /​sbin/​dhclient ​ 
-student ​ 22191  0.0  0.1  46012  3656 pts/0    R+   ​19:​48 ​  0:00 ps aux 
-</​code>​ 
- 
-Un utilitar echivalent lui Windows Task Manager pentru vizualizarea în timp real a proceselor care rulează, în linie de comandă, este htop. 
- 
-<code bash> 
-student@uso:​~$ htop 
-</​code>​ 
- 
-==== Atributele unui proces ==== 
- 
-Procesul este identificat în sistem cu ajutorul unui număr numit **PID** (process ID). Acesta este unic în sistem. Atunci când un proces este creat, se asignează un PID nou, următorul crescător liber. 
- 
-Un alt atribut important este PID-ul procesului părinte, **PPID**. Având o structură ierarhică, toate procesele au un părinte, părintele tuturor fiind **init** sau **systemd** (în funcție de sistem) și are PID-ul 1.  
- 
-Atributul **COMMAND** ne spune numele procesului sau comanda cu care a fost creat: 
-<code bash> 
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
-student ​ 23176  0.0  0.1  46012  3644 pts/0    R+   ​22:​06 ​  0:00 ps aux 
-</​code>​ 
- 
-Pentru o listă completă de atribute, verificați **manualul**. 
- 
-==== Foreground & Background (&, fg, bg, jobs) ==== 
- 
-Există mai multe stări în care un proces se poate afla: 
-    - Starea în care rulează ​ 
-    - Starea în care este oprit: se folosește **Ctrl+Z** 
-    - Starea în care este terminat (procesul nu mai există): se folosește **Ctrl+C** 
- 
-Apăsând o combinație de taste din cele de mai sus, trimitem un semnal procesului: 
- 
-^ Taste     ^ Semnificație ​                                             ^ 
-| **''​Ctrl+C''​** ​    | trimite ''​SIGINT'' ​                          | 
-| **''​Ctrl+Z''​** ​    | trimite ''​SIGSTOP'' ​      | 
-| **''​Ctrl+\''​** ​   | trimite ''​SIGQUIT'' ​  | 
- 
-În secțiunea **Demo** exemplificăm cum se trece prin aceste stări. 
- 
-==== Semnale (kill) ==== 
- 
-Un utilizator poate trimite un semnal unui proces folosind comanda kill! Este foarte important să înțelegem că scopul principal al utilitarului nu este omorârea de procese, deși poate face și asta. O listă a tuturor semnalelor posibile ce pot fi trimise aflăm prin 
- 
-<code bash> 
-student@uso:​~$ kill -l    
-</​code>​ 
- 
-Utilitarele **pkill** și **killall** termină procesele folosind ca argument **numele** procesului și nu PID-ul (ca la **kill**). 
- 
-==== Redirectare (>, >>, <, |) ==== 
- 
-Redirectare stdout (standard output, în general mesaje afișate prin comenzi similare cu printf din C). Pentru a redirecta lista proceselor într-un fișier, folosim următoarea comandă: 
- 
-<code bash> 
-student@uso:​~$ ps aux > procese.txt 
-</​code>​ 
- 
-Astfel, am specificat procesului să nu mai afișeze rezultatul pe ecran, ci într-un fișier. Diferența între **>** și **>>​** este că primul înlocuiește conținutul fișierului **procese.txt**,​ pe când al2lea adaugă la sfârșitul fișierului. 
- 
-Operatorul **<** folosit ''​comanda < fisier.txt''​ setează comenzii intrarea ''​fisier.txt''​. 
- 
-<code bash> 
-student@uso:​~$ grep "​Disable"​ < vm-actions-log.txt ​ 
-* Disable terminal bell and scrolling in terminal: 
-* Disable cursor blinking in terminal: 
-* Disable DNS usage in SSH server: 
-* Disable automated screen locking: 
-</​code>​ 
- 
-==== Comunicarea interprocese,​ folosind pipe | ==== 
-Operatorul **|** este foarte important și uzual folosit. Acesta ia rezultatul primei comenzi și îl oferă ca intrare la a2a comandă. Câteva exemple: 
- 
-<code bash> 
-student@uso:​~$ ps aux | grep sleep 
-student ​ 22406  0.0  0.0  16116   828 pts/0    S    20:28   0:00 sleep 1000 
-student ​ 22408  0.0  0.0  23076  1084 pts/0    S+   ​20:​28 ​  0:00 grep --color=auto sleep 
-</​code>​ 
- 
-<code bash> 
-student@uso:​~$ tree | grep Documents 
-├── Documents 
-</​code>​ 
- 
-Se pot înlănțui 2 sau mai multe comenzi. 
- 
-==== Procesele daemon ==== 
- 
-Procesele daemon sunt procese ce rulează în fundal. De obicei, acestea sunt servicii ce servesc anumite funcții specifice. Acestea pot fi recunoscute ca având procesul părinte cu PID 1 (procesul init sau systemd). ​ 
- 
-===== Demo ===== 
- 
-==== Vizualizarea proceselor din sistem (ps, pstree, top, htop) ==== 
- 
-Folosind ''​ps''​ fără nici un parametru vizualizăm procesele din shell-ul curent asociate utilizatorului curent. 
- 
-<code bash> 
-student@uso:​~$ ps 
-  PID TTY          TIME CMD 
-22101 pts/0    00:00:00 bash 
-22209 pts/0    00:00:00 ps 
-</​code>​ 
- 
-Tot cu ''​ps''​ putem vizualiza un ''​snapshot''​ al tuturor proceselor. Aceasta se poate obține folosind două variante ale comenzii: 
- 
-<code bash> 
-student@uso:​~$ ps aux 
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
-root         ​1 ​ 0.0  0.3 160140 ​ 7044 ?        Ss   ​10:​39 ​  0:02 /sbin/init spla 
-root         ​2 ​ 0.0  0.0      0     0 ?        S    10:39   0:00 [kthreadd] 
-[...] 
-student ​ 22101  0.0  0.2  31236  5192 pts/0    Ss   ​19:​38 ​  0:00 bash 
-student ​ 22114  0.0  0.2  31236  5008 pts/1    Ss+  19:38   0:00 bash 
-root     ​22151 ​ 0.0  0.3  25656  6260 ?        S    19:40   0:00 /​sbin/​dhclient ​ 
-student ​ 22191  0.0  0.1  46012  3656 pts/0    R+   ​19:​48 ​  0:00 ps aux 
-</​code>​ 
- 
-Un utilitar echivalent lui Windows Task Manager pentru vizualizarea în timp real a proceselor care rulează, în linie de comandă, este **htop**. 
- 
-<code bash> 
-student@uso:​~$ htop 
-</​code>​ 
- 
-==== Atributele unui proces ==== 
- 
-În mod implicit, când afișăm procesele, ni se arată următoarele atribute: 
-<code bash> 
-student@uso:​~$ ps aux 
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
-[...] 
-</​code>​ 
- 
-Putem specifica ce atribute să ne afișeze și în ce ordine dorim: 
- 
-<code bash> 
-student@uso:​~$ ps -ax -o ppid,​pid,​cmd 
- ​PPID ​  PID CMD 
-    0     1 /sbin/init splash 
-    0     2 [kthreadd] 
-[...] 
-</​code>​ 
- 
- 
-Pentru a selecta doar procesele pornite de utilizatorul student: 
- 
-<code bash> 
-student@uso:​~$ ps -f -u student 
-UID        PID  PPID  C STIME TTY          TIME CMD 
-student ​   900     ​1 ​ 0 11:10 ?        00:00:00 /​lib/​systemd/​systemd --user 
-student ​   901   ​900 ​ 0 11:10 ?        00:00:00 (sd-pam) 
-[...] 
-</​code>​ 
- 
-==== Foreground & Background (&, fg, bg, jobs) ==== 
- 
-Vom folosi ca exemplu utilitarul ''​sleep''​. Trebuie să știm dacă procesul nostru rulează sau nu. Pentru a verifica acest lucru, dintr-un alt terminal, ne folosim de utilitarul ''​ps'':​ 
- 
-Terminal 1: 
-<code bash> 
-student@uso:​~$ sleep 100 
-</​code>​ 
- 
-Terminal 2: 
-<code bash> 
-student@uso:​~$ ps aux 
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
-root         ​1 ​ 0.0  0.3 160140 ​ 7044 ?        Ss   ​10:​39 ​  0:02 /sbin/init spla 
-root         ​2 ​ 0.0  0.0      0     0 ?        S    10:39   0:00 [kthreadd] 
-[...] 
-student ​ 22268  0.0  0.0  16116   884 pts/0    S    19:54   0:00 sleep 100 
-student ​ 22281  0.0  0.1  46012  3744 pts/0    R+   ​19:​54 ​  0:00 ps aux 
-</​code>​ 
- 
-Am găsit procesul ''​sleep''​ în sistem. Putem folosi utilitarul ''​pgrep''​ pentru a afla PID-ul procesului. 
- 
-<code bash> 
-student@uso:​~$ pgrep sleep 
-22268 
-</​code>​ 
- 
-Pentru a opri procesul, vom folosi combinația de taste **Ctrl+Z**: 
- 
-<code bash> 
-student@uso:​~$ sleep 100 
-student@uso:​~$ ^Z 
-[1]+  Stopped ​                sleep 100 
-student@uso:​~$ jobs 
-[1]+  Stopped ​                sleep 100 
-</​code>​ 
- 
-Am folosit utilitarul ''​jobs''​ pentru a vedea ce procese sunt active în terminalul curent. De aici putem folosi **bg** (background) pentru a porni procesul în mod interactiv sau **fg** (foreground) pentru a porni procesul în mod neinteractiv. Mai simplu, la ''​bg''​ putem da alte comenzi în timp ce programul nostru rulează, iar la ''​fg''​ nu putem să dăm alte comenzi. 
- 
-==== Semnale (kill) ==== 
- 
-Vom folosi în continuare comanda **kill** pentru a trimite semnale proceselor. Această comandă nu omoară neapărat procesul, în ciuda numelui. 
- 
-<code bash> 
-student@uso:​~$ kill --help 
-kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 
-    Send a signal to a job. 
-</​code>​ 
- 
-Dintr-un alt terminal aflăm PID-ul procesului ''​sleep''​ folosind utilitarul **pgrep**. ​ 
-Pentru a termina procesul, trimitem semnalul 9 (SIGKILL): 
- 
-<code bash> 
-student@uso:​~$ jobs 
-[1]+  Stopped ​                sleep 100 
-student@uso:​~$ pgrep sleep 
-22286 
-student@uso:​~$ kill -9 22286 
-student@uso:​~$ jobs 
-[1]+  Killed ​                 sleep 100 
-</​code>​ 
- 
-Am transmis semnalul 9 (SIGKILL) procesului 22286, iar acesta a fost terminat instant. 
- 
-==== Redirectare ==== 
- 
-Pentru a redirecta lista proceselor într-un fișier, folosim următoarea comandă: 
- 
-<code bash> 
-student@uso:​~$ ps aux > procese.txt 
-</​code>​ 
- 
-Astfel, am specificat procesului să nu mai afișeze rezultatul pe ecran, ci într-un fișier. Diferența între **>** și **>>​** este că primul înlocuiește conținutul fișierului **procese.txt**,​ pe când al2lea adaugă la sfârșitul fișierului. 
-Astfel, executând a2a oară comanda: 
- 
-<code bash> 
-student@uso:​~$ ps aux >> procese.txt 
-</​code>​ 
- 
-Vom avea în fișierul ''​procese.txt''​ afișat de 2 ori ieșirea comenzii. 
- 
-==== Comunicare interprocese,​ folosind | ==== 
- 
-Operatorul **|** este foarte important și uzual folosit. Acesta ia rezultatul primei comenzi și îl oferă ca intrare la a doua comandă. Câteva exemple: 
- 
-<code bash> 
-student@uso:​~$ ps aux | grep sleep 
-student ​ 22406  0.0  0.0  16116   828 pts/0    S    20:28   0:00 sleep 1000 
-student ​ 22408  0.0  0.0  23076  1084 pts/0    S+   ​20:​28 ​  0:00 grep --color=auto sleep 
-</​code>​ 
- 
-<code bash> 
-student@uso:​~$ tree | grep Documents 
-├── Documents 
-</​code>​ 
- 
-===== Basics ===== 
- 
-==== Vizualizarea proceselor din sistem (ps, pstree, top, htop) ==== 
- 
-Folosind ''​ps''​ fără nici un parametru vizualizăm procesele din shell-ul curent asociate utilizatorului curent. 
- 
-<code bash> 
-student@uso:​~$ ps 
-  PID TTY          TIME CMD 
-22101 pts/0    00:00:00 bash 
-22209 pts/0    00:00:00 ps 
-</​code>​ 
- 
-Parametrul **aux** asociat lui **ps** ne arată toate procesele din sistem: 
- 
-<code bash> 
-student@uso:​~$ ps aux 
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
-root         ​1 ​ 0.0  0.3 160140 ​ 7044 ?        Ss   ​10:​39 ​  0:02 /sbin/init spla 
-root         ​2 ​ 0.0  0.0      0     0 ?        S    10:39   0:00 [kthreadd] 
-[...] 
-student ​ 22101  0.0  0.2  31236  5192 pts/0    Ss   ​19:​38 ​  0:00 bash 
-student ​ 22114  0.0  0.2  31236  5008 pts/1    Ss+  19:38   0:00 bash 
-root     ​22151 ​ 0.0  0.3  25656  6260 ?        S    19:40   0:00 /​sbin/​dhclient ​ 
-student ​ 22191  0.0  0.1  46012  3656 pts/0    R+   ​19:​48 ​  0:00 ps aux 
-</​code>​ 
- 
-==== Atributele unui proces ==== 
- 
-Pentru a selecta doar procesele pornite de utilizatorul student folosim **-u**: 
- 
-<code bash> 
-student@uso:​~$ ps -f -u student 
-UID        PID  PPID  C STIME TTY          TIME CMD 
-student ​   900     ​1 ​ 0 11:10 ?        00:00:00 /​lib/​systemd/​systemd --user 
-student ​   901   ​900 ​ 0 11:10 ?        00:00:00 (sd-pam) 
-[...] 
-</​code>​ 
- 
-Putem specifica ce atribute să ne afișeze și în ce ordine dorim: 
- 
-<code bash> 
-student@uso:​~$ ps -ax -o ppid,​pid,​cmd 
- ​PPID ​  PID CMD 
-    0     1 /sbin/init splash 
-    0     2 [kthreadd] 
-[...] 
-</​code>​ 
- 
-Până a trece mai departe, trebuie să vă asigurați că ați înțeles cum trebuie navigarea printr-o ierarhie de procese. Pentru asta, parcurgeți următoarele exerciții după care verificați cu asistentul că totul este în regulă. 
-  - Afișați toate procesele din sistem care să conțină date legate de PID, PID-ul părintelui,​ user-ul care deține procesul și comanda care a pornit procesul 
-  - Filtrați procesele după utilizatorul curent (student) 
-  - Afișați procesele în mod interactiv (folosind top/htop) 
- 
  
sde/laboratoare/05_ro_procese.1584456610.txt.gz · Last modified: 2020/03/17 16:50 by ioana_maria.culic
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0