User Tools

Site Tools


medium-unix:capitole:capitol-04

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

Exerciții

Demo-uri

Lucrul cu procese

Pentru a afla informații despre procese se poate folosi utilitarul ps.

Pentru a afișa toate procesele ce rulează în respectivul moment, rulați comanda:

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.

Căutați după șirul negates în pagina de manual a comenzii ps după șirul forest.

Afișați procesele care nu aparțin utilizatorului student.

Căutați după șirul negates în pagina de manual a comenzii ps după șirul.

Afișați pentru toate procesele următoarele atribute: PID, comanda cu care a fost lansat, niceness, PID-ul părinteluiși sortați descendent lista după PID-ul părintelui.

Căutați în pagina de manual a comenzii ps secțiunea STANDARD FORMAT SPECIFIERS.

Verificați faptul că procesul init (PID-ul 1) adoptă procesele orfane. Deschideți un nou terminal și din acesta porniți o instanță de xterm în background. Din instanța de xterm, porniți o a doua instanță de xterm în background. Din terminal afișați lista proceselor în format arborscent, afișând și PID-ul fiecărui proces.

Pentru afișare în format arborescent folosiți comanda pstree.

Identificați PID-ul primei sesiuni de xterm și trimiteți procesului respectiv semnalul SIGKILL. Identificați procesul părinte al celei de-a doua sesiuni de xterm.

Folosiți comanda free pentru a obține detalii despre memoria ocupată.

free poate fi folosit și ca un utilitar pentru monitorizarea continuă a stării memoriei. Identificați un parametru care produce output o dată la 2 secunde.

Folosiți comanda uptime pentru a determina de cât timp funcționează sistemul. Identificați aceleași valori cu ajutorul comenzii top.

Să se afișeze toate fișierele dechise de procesul bash pornit de utilizatorul student.

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 a comenzii ps secțiunea STANDARD FORMAT SPECIFIERS.

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.

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.

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

medium-unix/capitole/capitol-04.txt · Last modified: 2016/05/17 23:11 by mtiganus