Differences

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

Link to this comparison view

uso:laboratoare:new:02-process [2018/10/09 21:47]
razvan.deaconescu removed
uso:laboratoare:new:02-process [2018/10/09 22:06] (current)
razvan.deaconescu [Cuprins]
Line 1: Line 1:
 ====== Laborator 02: Procese ====== ====== Laborator 02: Procese ======
  
-===== Înainte de laborator =====+{{page>:​uso:​laboratoare:​new:​02-process:​setup&​nofooter&​noeditbutton}}
  
-==== Utilizare terminal ​====+===== Cuprins =====
  
-Pentru a deschide un terminal nou: +{{page>uso:laboratoare:new:​02-process:​nav&noheader&nofooter&noeditbutton}}
- +
-^ 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 compenț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-procespipe-uri și semnale +
- +
-==== Folosire Git pentru laborator ==== +
- +
-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|acest repository Git]]. +
- +
-În laboratorul curent, pe sistemele din laborator (și pe [[https://​ocw.cs.pub.ro/​courses/​uso/​resurse/​mv|mașina virtuală]]) aveți deja clonat repository-ul Git în directorul ''​~/​uso.git/''​. Vom preciza acest lucru pe parcursul laboratorului. +
- +
-<note important>​ +
-Pentru a pregăti infrastructura de laborator rulați comenzile de mai jos într-un terminal deschis în mașina virtuală. 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. Recomandăm să **nu** folosiți //​copy-paste//​ ca să vă acomodați cu linia de comandă: +
-<​code>​ +
-student@uso:​~$ cd uso.git/ +
-student@uso:​~/​uso.git$ git reset --hard +
-student@uso:​~/​uso.git$ git clean -f -d +
-student@uso:​~/​uso.git$ git fetch origin +
-student@uso:​~/​uso.git$ git checkout -b lab-02-process +
-student@uso:~/uso.git$ git rebase origin/​lab-02-process +
-</​code>​ +
- +
-Dacă la a cincea comandă rulată (''​git checkout -b lab-02-process''​) primiți o eroare de forma ''​fatal:​ A branch named '​lab-02-process'​ already exists.'',​ nu vă îngrijorați,​ nu e nici o problemă. +
- +
-Dacă la un moment dat în lucrul în repository ați șters sau modificat ceva și doriți să reveniți la starea inițială, rulați din nou comenzile de mai sus. +
-</​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 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>​ +
-===== Recapitulare ===== +
- +
-    - Afișați recursiv, pornind din directorul ''​uso.git'',​ toate fișiere și directoarele. Puteți alege oricare din variantele învățate anterior. +
-    - Creați o arhivă cu fișierele menționate mai sus. +
-===== 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) +
-===== Need to Know ===== +
- +
-==== Foreground & Background (&, fg, bg, jobs) ==== +
- +
-Vom folosi ca exemplu programul bg-proc.sh. Acesta afișează în fiecare secundă câte un mesaj "​Tick"​ sau "​Tock"​. Pornim programul:​ +
- +
-<code bash> +
-student@uso:​~/​uso/​lab04$ ./​bg-proc.sh  +
-Tick! +
-Tock! +
-Tick! +
-^C +
-</​code>​ +
- +
-L-am terminat cu **Ctrl+C**:​ +
- +
-Îl pornim din nou și de data asta îl oprim cu **Ctrl+Z**. Ce observăm?​ +
- +
-<code bash> +
-student@uso:​~/​uso/​lab04$ ./​bg-proc.sh  +
-Tick! +
-Tock! +
-Tick! +
-^Z +
-[1]+  Stopped ​                ​./​bg-proc.sh +
-</​code>​ +
- +
-Verficăm dacă procesul încă există în sistem: +
- +
-<code bash> +
-student@uso:​~/​uso/​lab04$ ps aux +
-USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND +
-root         ​1 ​ 0.0  0.3 160140 ​ 7152 ?        Ss   ​oct08 ​  0:03 /sbin/init splash +
-root         ​2 ​ 0.0  0.0      0     0 ?        S    oct08   0:00 [kthreadd] +
-[...] +
-**student ​ 23597  0.0  0.1  21532  3532 pts/0    T    09:53   0:00 /bin/bash ./​bg-proc.sh** +
-student ​ 23600  0.0  0.0  16116   780 pts/0    T    09:53   0:00 sleep 1 +
-student ​ 23601  0.0  0.1  46012  3784 pts/0    R+   ​09:​53 ​  0:00 ps aux +
-</​code>​ +
- +
-Pentru a reporni procesul avem 2 variante: +
-  - Pornim procesul în mod **interactiv** folosind comanda **bg**. Asta înseamnă că noi putem da comenzi, chiar dacă în fundal este un proces care afișează text +
-  - Pornim procesul în mod **neinteractiv** folosind comanda **fg**. Asta înseamnă că procesul oprit anterior a revenit în prim-plan în terminal. Nu vom putea da alte comenzi. +
- +
-<code bash> +
-student@uso:​~/​uso/​lab04$ ./​bg-proc.sh +
-Tick! +
-Tock! +
- +
-[1]+  Stopped ​                ​./​bg-proc.sh +
-student@uso:​~/​uso/​lab04$ bg +
-[1]+ ./​bg-proc.sh & +
-student@uso:​~/​uso/​lab04$ Tick! +
-Tock! +
-lsTick! +
- +
-batman.sh ​ bg-proc.sh ​ it-s-a-trap.sh +
-student@uso:​~/​uso/​lab04$ Tock! +
-Tick! +
-Tock! +
-^C +
-student@uso:​~/​uso/​lab04$ Tick! +
-Tock! +
-</​code>​ +
- +
-Puteți observa că am încercat să termin programul folosind **Ctrl+C**. Acest lucru nu a fost posibil pentru că acesta rula în fundal. Pentru asta trebuie să aducem procesul în prim-plan și să îl terminăm sau să îi aflăm PID-ul și să-l terminăm folosind utilitarul **kill**. +
- +
-**Exerciții** +
-  - Porniți programul **bg-proc.sh**. +
-  - Treceți-l în starea ''​foreground''​ și apoi în background. +
-  - Terminați procesul cu **Ctrl+C** și cu utilitarul **kill** +
-  - Faceți același lucru și cu programul **it-s-a-trap.sh** +
- +
-==== Redirectare ==== +
- +
-Pentru a redirecta lista proceselor într-un fișier, folosim următoarea comandă: +
- +
-<code bash> +
-student@uso:​~$ ps aux > procese.txt +
-</​code>​ +
- +
-Un alt exemplu de redirectare este: +
- +
-<code bash> +
-student@uso:​~/​uso/​lab04$ echo "prima linie din fisier"​ > fis.txt +
-student@uso:​~/​uso/​lab04$ cat fis.txt  +
-prima linie din fisier +
-student@uso:​~/​uso/​lab04$ echo "a2a linie din fisier"​ >> fis.txt  +
-student@uso:​~/​uso/​lab04$ cat fis.txt  +
-prima linie din fisier +
-a2a linie din fisier +
-student@uso:​~/​uso/​lab04$ echo "a3a linie din fisier"​ > fis.txt  +
-student@uso:​~/​uso/​lab04$ cat fis.txt  +
-a3a linie din fisier +
-</​code>​ +
- +
-Putem observa că la a3a linie am folosit **>** în loc de **>>​** și am șters conținutul anterior al fișierului. +
- +
-==== Comunicare interprocese,​ folosind | ==== +
- +
-Putem căuta după un anumit proces din sistem astfel: +
- +
-<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>​ +
- +
-Care este logica din spatele comenzii? În loc să ne afișeze nouă pe ecran rezultatul comenzii **ps aux**, acesta a fost transmis către următoarea comandă **grep**. Comanda din urmă a căutat cuvântul ''​sleep''​ în rezultatul comenzi ''​ps aux''​. +
- +
-Un alt exemplu: +
- +
-<code bash> +
-student@uso:​~/​uso$ ls -lR | grep "​hello"​ +
--rw-r--r-- 1 student student ​  72 sep 10 12:25 hello.c +
--rw-r--r-- 1 student student ​ 72 sep 10 12:25 hello.c +
--rw-r--r-- 1 student student 154 sep 10 12:25 hello.c +
--rw-r--r-- 1 student student ​ 95 sep 10 12:25 simple_hello.c +
--rw-r--r-- 1 student student 580 sep 10 12:25 hello.s +
--rw-r--r-- 1 student student 1192 sep 10 12:25 hello.o +
--rw-r--r-- 1 student student ​  15 sep 10 12:25 hello.h +
--rw-r--r-- 1 student student ​  64 sep 10 12:25 hello_0.c +
--rw-r--r-- 1 student student ​  82 sep 10 12:25 hello_1.c +
--rw-r--r-- 1 student student ​ 111 sep 10 12:25 hello_2.c +
--rw-r--r-- 1 student student ​  83 sep 10 12:25 hello_3.c +
--rw-r--r-- 1 student student ​ 142 sep 10 12:25 hello_4.c +
--rw-r--r-- 1 student student ​ 145 sep 10 12:25 hello_5.c +
--rw-r--r-- 1 student student ​ 150 sep 10 12:25 hello_6.c +
--rw-r--r-- 1 student student ​ 162 sep 10 12:25 hello_7.c +
--rw-r--r-- 1 student student 16 sep 10 12:25 hello.h +
-lrwxrwxrwx 1 student student ​ 7 sep 10 12:25 hello_from_the_other_side.h -> hello.h +
-</​code>​ +
- +
-Am afișat recursiv (-R) directorul **uso** și am transmis rezultatul către utilitarul **grep** pentru a căuta fișierele ce conțin cuvântul ''​hello''​. +
- +
-**Exerciții** +
-  - Afișați recursiv toate fișierele și directoarele din **uso.git**,​ redirectând totul într-un fișier. Înspectați fișierul pentru verificare. +
-  - Înlănțuiți comanda precedentă cu **grep** pentru a căuta în **uso.git** fișierele ce conțin cuvântul **lab**. +
-===== Nice to Know ===== +
- +
-==== Valori de eroare ==== +
- +
-Putem verifica dacă comanda executată anterior s-a executat cu succes folosind **$?**: +
- +
-<code bash> +
-student@uso:​~/​uso$ cat README.md  +
-uso +
-=== +
- +
-   * Directorul ''​lab02''​ conține toate fișierele și structura de directoare necesare rezolvării laboratorului 2 de către studenți +
-student@uso:​~/​uso$ echo $? +
-+
-student@uso:​~/​uso$ cat fisier-care-nu-exista.txt +
-cat: fisier-care-nu-exista.txt:​ No such file or directory +
-student@uso:​~/​uso$ echo $? +
-+
-</​code>​ +
- +
-Atunci când valoarea este **0**, procesul s-a executat cu succes. Orice diferit de 0 este o eroare. +
- +
-**Exerciții** +
-  - Încercați să afișați un fișier ce nu există. Ce cod de eroare primiți? +
-  - Încercați să rulați o comandă cu parametri aleatori (ex: ps -ewqgew). Ce cod de eroare primiți? +
- +
-==== Structura arborescentă a proceselor ==== +
- +
-Afișăm toate procesele din sistem cu atributele PID, PPID, CMD: +
- +
-<code bash> +
-student@uso:​~/​uso$ ps ax -o pid,​ppid,​cmd +
-  PID  PPID CMD +
-    1     0 /sbin/init splash +
-[...] +
-19540     2 [jfsSync] +
-22046     2 [kworker/​0:​1] +
-22090   900 /​usr/​lib/​gnome-terminal/​gnome-terminal-server +
-22101 22090 bash +
-22114 22090 bash +
-22234     1 /​usr/​bin/​python3 /​usr/​bin/​update-manager --no-update --no-focus-on-map +
-22559     1 /​usr/​sbin/​cupsd -l +
-22560     1 /​usr/​sbin/​cups-browsed +
-22742     2 [loop10] +
-22785     1 /​usr/​lib/​snapd/​snapd +
-22913     2 [loop12] +
-23200     2 [kworker/​u2:​0] +
-23394   530 /​sbin/​dhclient -d -q -sf /​usr/​lib/​NetworkManager/​nm-dhcp-helper -pf /​run/​dhclient-enp0s8.pid -lf /​var/​lib/​NetworkManager/​dhclient-fda81623-2338-36f +
-23519     2 [kworker/​u2:​1] +
-23974     2 [kworker/​u2:​2] +
-24107 22101 ps ax -o pid,​ppid,​cmd +
-</​code>​ +
- +
-Putem observa că părintele comenzii executate de noi este **bash**; are PID-ul 22101. +
- +
-**Exerciții** +
-  - Pornind de la tutorialul de mai sus, urmăriți PID-ul și PPID-ul procesului ''​ps'',​ **recursiv** +
-  - Faceți asta cu 2-3 procese. Unde se opresc toate procesele?​ +
-===== Get a Life ===== +
- +
-==== Procese detașate de terminal ==== +
- +
-Pentru acest exercițiu avem nevoie de pachetul **transmission-cli**. Îl putem instala folosind comanda: +
- +
-<code bash> +
-student@eg306:​~$ sudo apt-get install transmission-cli +
-</​code>​ +
- +
-Folosiți Transmission în linie de comandă pentru a descărca o imagine de Ubuntu, [[http://​releases.ubuntu.com/​17.04/​ubuntu-17.04-desktop-amd64.iso.torrent?​_ga=2.179407716.1129929276.1508229525-1809341997.1504894444|de aici]]. Descărcați fișierul .torrent în ''/​home/​student/​Downloads''​. +
- +
-<code bash> +
-student@midgard:​~$ transmission-cli ~/​Downloads/​ubuntu-17.04-desktop-amd64.iso.torrent +
-</​code>​ +
- +
-Dintr-un alt terminal determinați PID-ul acestui proces. Închideți terminalul din interfața grafică (X din colțul din dreapta sus). Căutați din nou procesul după identificator. +
- +
-**1.1** Ce s-a întâmplat cu procesul nostru transmission-cli tocmai creat? Care credeți că este cauza? +
- +
-Deschideți din nou un terminal, dar de data folosiți-vă de comanda **nohup** (man nohup) pentru a lansa procesul ''​transmission-cli''​ pentru descărcarea imaginii de Ubuntu. Închideți din nou terminalul din interfața grafică. Observați că procesul rămâne în viață. Determinați PID-ul acestui proces. +
- +
-**1.2** Ce fel de semnal se generează atunci când închidem terminalul și pe care a doua oară procesul transmission-gtk îl ignoră? +
- +
-==== Trimiterea de semnale unui proces ==== +
- +
-Mergeți în directorul ''​support''​ aferent laboratorului unde găsiți scriptul ''​batman.sh''​. +
- +
-Rulați-l. Procesul interceptează toate semnalele cu indecși de la 1 la 13, mai puțin 9 (din motive evidente). De fiecare dată când primește un semnal cu indexul între 1 și 13 el afișează pe ecran un caracter. Mai jos aveți maparea dintre indecșii semnalelor și caracterul afișat: +
- +
-<columns 50% 50% -> +
- +
-^Index semnal ^ Caracter ^ +
-| 1           ​| ​ o       | +
-| 2           ​| ​ u       | +
-| 3           ​| ​ c       | +
-| 4           ​| ​ d       | +
-| 5           ​| ​ e       | +
-| 6           ​| ​ z       | +
- +
-<​newcolumn>​ +
- +
-^Index semnal ^ Caracter ^ +
-| 7           ​| ​ s       | +
-| 8           ​| ​ h       | +
-| 10          |  (space) | +
-| 11          |  r       | +
-| 12          |  k       | +
-| 13          |  l       | +
- +
-</​columns>​ +
- +
-**2.1** Într-un alt terminal aflați pid-ul procesului și trimiteți-i semnale astfel încât procesul să afișeze pe ecran șirul de caractere ''​uso rullz''​.  +
-===== Sumar. Cuvinte cheie ===== +
- +
-  * Procese: noțiunea de proces, resursele unui proces +
-  * Vizualizarea și monitorizarea proceselor: ''​ps'',​ ''​top'',​ ''​htop''​ +
-  * Foreground & background: operatorul ''&'',​ ''​fg'',​ ''​bg'',​ ''​jobs''​ +
-  * Semnale, transmiterea semnalelor: ''​kill'',​ ''​pkill''​ +
-  * Identificarea proceselor, PID-uri: ''​pidof'',​ ''​pgrep''​ +
-  * Ierarhia proceselor: ''​pstree''​ +
-  * Redirectarea în/din fișiere: operatorii ''>''​ și ''<''​ +
-  * Comunicarea interproces prin pipe-uri: operatorul ''​|''​+
  
uso/laboratoare/new/02-process.1539110833.txt.gz · Last modified: 2018/10/09 21:47 by razvan.deaconescu
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