====== 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