====== 3. Procese, thread-uri și memorie ======
Acțiunile sunt executate la nivelul sistemului de fișiere prin procese. Rularea unei comenzi înseamnă crearea unui proces în sistemul de operare, proces care execută acțiunea indicată de executabilul din care a luat naștere. Procesele sunt entități active care consumă resurse la nivelul sistemului de operare, cele mai importante fiind procesor, memorie și diverse forme de input/output.
===== Subiecte abordate =====
* Procese, operații cu procese, planificarea proceselor
* Investigarea proceselor
* Thread-uri, informații despre thread-uri
* Operatori shell de secvențiere și intercomunicare
* Redirectări
* Foreground/background
* Daemoni, daemonizarea proceselor
==== Best practices ====
* Folosirea eficientă a shell-lui: scurtături readline, shell history (reverse search, ''Alt+.'', ''%%!!%%'')
* În general, nu se prelucrează output-ul comenzii ''ps''
* Selecția de informații pe orizonatală (ce procese?) față de selecția pe verticală (ce atribute?)
* ''\time'' vs ''time''
* ''killall'' vs ''pkill''
==== Utilitare folosite ====
* ''ps'', ''pstree'', ''top'', ''htop'', ''/proc'', ''pidof''
* ''kill'', ''pkill''
* ''time'', ''lsof''
* ''nohup'', ''screen'', ''tmux''
* ''supervisord''
===== Resurse utile =====
Descărcați arhiva de la adresa http://swarm.cs.pub.ro/~razvan/tmp/packages.zip. Copiați-o în mașina virtuală, decomprimați-o și instalați pachetele din cadrul acesteia.
După ce ați decomprimați arhiva instalați pachetele folosind comezi precum
sudo dpkg -i sysstat_11.0.1-1_i386.deb
===== Exerciții =====
==== Demo: Folosirea eficientă a shell-ului ====
Folosirea scurtăturilor din biblioteca readline
Folosirea ''Alt+.'' (sau ''$_'')
Folosirea istoriei (''Ctrl+r'', ''%%!!%%'')
==== Demo: Lucru cu procese ====
Afișați apoi lista proceselor tuturor utilizatorilor.
Obțineți o listare arborescentă a proceselor folosind comanda {{{pstree}}} și apoi obțineți o listare similară (arborescentă) folosind comanda ''ps''. (**Indiciu**: Căutați după șirul //forest// în pagina de manual a comenzii ''ps'').
Afisați toate procesele care **nu** apartin utilizatorului {{{root}}}. (**Indiciu**: Căutați în pagina de manual după șirul ''negate'')
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 5 intrări. (**Indiciu**: Folosiți opțiunea ''%%--sort%%'' a comenzii ''ps''.
==== 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 ''training''. 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.
Afișați cele mai consumatoare de memorie 5 procese din sistem care **nu** aparțin utilizatorului ''root''.
Pentru afișarea de mai sus, folosiți opțiunea de ascundere a header-ului în afișarea comenzii ''ps''.
Afisați pentru toate procesele utilizatorului ''training'' următoarele atribute: pid, ppid, niceness-ul, comanda cu ajutorul căreia a fost lansat procesul, numărul de fire de execuție (//thread//-uri) din procesul respectiv. Pentru a găsi numărul de fire de execuție (//thread//-uri) din procesul respectiv, căutați după șirul //number// în pagina de manual a comenzii ''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
$ sudo su
# adduser ana
[...]
# exit # sau puteti folosi combinatia de taste Ctrl+d
$
În acel tab nou ne autentificăm ca utilizatorul ''ana'' folosind comanda
$ su - ana
Î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
$ tty
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.
==== Demo: Investigarea unui proces ====
Folosirea ''lsof'' pentru a investiga redirectare și pipe din cadrul unui proces.
Folosirea ''time'' pentru a afla informații legate de încheierea rulării unui proces.
==== Folosirea nohup ====
Ne propunem să pornim un tracker de BitTorrent în background, folosind ''nohup''. Pentru început porniți tracker-ul în foreground ca să acomodați cu modul său de pornire.
Pentru pornirea tracker-ului folosiți comanda
bttrack --dfile bttrack.dfile --port 12345
Închideți tracker-ul (folosind ''Ctrl+c'') și porniți-l în background folosind comanda ''nohup''. Redirectați output-ul tracker-ului în fișierul cu numele ''bttrack.log''.
Închideți shell-ul din care ați lansat tracker-ul. Afișați fișierele deschise de procesul tracker folosind comanda ''lsof''.
Listați serviciile sistemului și verificați că procesul tracker este pornit folosind comanda
netstat -tlpn
==== Folosirea tmux ====
Porniți într-un ecran ''tmux'' un tracker BitTorrent, un server HTTP Python, un editor Vim sau Emacs și încă un ecran pentru comenzi.
Pentru pornirea ''tmux'' folosiți comanda
tmux
Pentru a deschide ecrane noi în ''tmux'' folosiți combinația de taste ''Ctrl+b'' și apoi separat ''c''. Pentru a tranzita între ferestre folosiți combinațiile de taste ''Ctrl+b'' urmat de ''n'' și ''Ctrl+b'' urmat de ''p''. Pentru a închide un ecran închideți shell-ul folosind ''Ctrl+d'' sau ''exit'' sau ''logout''.
Pentru a vă detașa de ''tmux'' folosiți combinația de taste ''Ctrl+b'' urmat de ''d''. Pentru a vă reatașa la ''tmux'' folosiți comanda
tmux attach
Pentru a porni un server HTTP Python folosiți comanda
python -m SimpleHTTPServer
==== Folosirea supervisord ====
Folosiți ''supervisord'' pentru a porni un tracker de BitTorrent cu ajutorul comenzii ''bttrack''.
Urmăriți exemplele de configurare din link-urile de mai jos:
* https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps
* https://serversforhackers.com/monitoring-processes-with-supervisord