====== 4. Lucrul cu procese ====== 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 * Foreground/background ==== Best practices ==== * Î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'', ''pgrep'' * ''time'', ''lsof'' * ''tmux'' ===== Resurse utile ===== * TODO * TODO ==== Slide-uri ==== [[http://koala.cs.pub.ro/training/res/medium-unix/slides/cap-04.pdf|Slide-uri capitol 4]]
ps -e
Observați ce informații furnizează rularea numai cu acest parametru (capul de tabel).
Selecția se poate face după o serie de criterii (utilizatorul ce deține procesul, comanda cu care acest a fost lansat, PID etc.). Pentru a selecta doar procesele ce aparțin utilizatorului {{{student}}}, executați comanda:
ps -u student
Rulați comanda:
ps -e -F
Observați în ce mod s-a modificat capul tabelului.
Se poate alege ce câmpuri să fie afișate (PID, utilizator, comandă, memorie ocupată etc.). Pentru a afișa PID-ul, utilizatorul, procentul din memorie utilizat și comanda cu care a fost lansat un proces, rulați comanda:
ps -e -o pid,user,%mem,cmd
Opțiunile de selecție se pot combina cu cele de formatare. De exemplu, pentru a afișa PID-ul și memoria ocupată de procesul cu PID-ul 1, executați:
ps -p 1 -o pid,%mem
Lista se poate sorta după un criteriu dat. De exemplu, putem sorta ascendent lista tuturor proceselor din sistem după PID:
ps -A -o pid,%mem --sort +pid
Pentru a sorta descendent se pune {{{-}}} (minus) în loc de {{{+}}} (plus) în fața criteriului de sortare.
=== Investigarea proceselor ===
Deschideți o instanță de editor ''emacs''.
Aflați PID-ul acestuia și, din alt terminal, opriți procesul:
kill -SIGSTOP PID
Această comandă are același efect ca și combinația de taste {{{Ctrl + z}}}. Pentru a termina complet procesul, se pot folosi semnalele {{{SIGTERM}}} sau {{{SIGKILL}}}.
Comanda {{{lsof}}} afișează descriptorii de fișier ai unui proces. Rularea acesteia fără niciun argumente afișează o listă de fișiere care aparține tuturor proceselor deschise:
lsof
Pentru a lista procesele care au deschis fișiere dintr-un anumit director:
lsof +D /dev/
Pentru a lista procesele pornite de un anumit utilizator:
lsof -u "student"
Pentru a lista procesele care încep cu un string:
lsof -c "ssh"
Vizualizarea descriptorilor de fișier folosind comanda ''lsof'' pentru procesul ''sleep'' din fiecare din comenzile de mai jos
sleep 30 > a.txt
sleep 30 < a.txt
sleep 30 < a.txt > b.txt 2> c.txt
cat | sleep 30 | cat
=== Rularea în background ===
Pornire proces ''emacs'' și folosire ''Ctrl+z'' și ''bg'' pentru rulare în background.
Pornire proces ''emacs'' direct în background.
==== Exerciții cu procese ====
Obțineți o listare arborescentă a proceselor folosind comanda {{{pstree}}} și apoi obţineţi o listare similară arborescentă) folosind comanda {{{ps}}}.
$ 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.
==== 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.
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
python -m SimpleHTTPServer