Faceţi căutări pe acest blog

Se încarcă...

duminică, 14 decembrie 2014

Procese în Linux

 Proces= program în execuție!

 În Linux procesele au o structură ierarhică, arborescentă, rădăcina arborelui fiind procesul init, primul program rulat la pornire în user-space, PID 1, daemonul systemd dacă distribuția folosește systemd.  În momentul lansării în execuție a unui program, sistemul de operare va crea un proces pentru a fi alocate resursele necesare rulării programului. E posibil ca un program să fie rulat în mai multe instanțe, de mai multe ori, fiecărei instanțe a aplicației respective corespunzându-i un proces independent de celelalte, de exemplu citiți/ editați mai multe documente text cu kwrite, fiecare fereastră a kwrite are deschis un fișier, reprezintă o instanță a editorului și un proces separat! Fiecare proces este diferențiat prin PID (Process Identifier sau Process ID), un număr alocat proceselor consecutiv, 1, 2, 3, șamd, limita maximă a acestei numerotări e stabilită în fișierul /proc/sys/kernel/pid_max, o puteți afla cu cat /proc/sys/kernel/pid_max.
[ shogun @ stress ] - [ Arch ] - [ ~ ]
[$]> cat /proc/sys/kernel/pid_max
32768


 Există și un proces cu PID 0, sched sau swapper, dar rulează în kernel-space și aparține de fapt kernelului, nu este un proces user-mode, nu rulează în user-space, motiv pentru care nu-l putem vedea la afișarea proceselor!

 AFIȘARE PROCESE
 Putem vedea ce procese rulează fie cu utilitarul grafic furnizat de mediul grafic (ksysguard pentru Kde, xfce4-taskmanager pentru Xfce4, șamd), fie în linie de comandă cu comanda ps, comandă care ne arată un snapshot al proceselor curente sau top/ htop/ atop, utilitare interactive care actualizează constant afișarea. Utilitarul grafic îl găsiți în meniu sau îl puteți rula cu ajutorul Krunner/ Run, Alt+F2, tastați ksysguard sau xfce4-taskmanager, Enter.
 Procesele sunt afișate în coloană, pe linii fiind trecute informațiile necesare, nume proces, utilizator, PID, consum resurse, comanda de pornire și altele, afișarea este customizabilă, putem adăuga sau șterge coloane cu informații după plac.









 În screenshotul cu outputul comenzii ps -ef apare o coloană PPID, în acea coloană este trecut ”părintele” procesului respectiv, vă spuneam că în Linux ierarhia este arborescentă, există o relație părinte- fiu, toate procesele sunt create de alt proces prin fork (un proces crează un proces diferit, o copie a resurselor sale, cu un adress-space diferit, un PID diferit), cu excepția procesului special cu PID 0 (swapper), care este creat la boot, apoi crează prin fork procesul PID 1 (init), proces init (systemd în cazul meu și al tuturor distribuțiilor ce folosesc systemd pentru init) care va deveni părintele/ rădăcina/ strămoșul/ originea tuturor proceselor următoare!!! Orice proces are un părinte, dar poate avea oricât de mulți ”fii”. Dacă un proces părinte este terminat înaintea proceselor fiu, aceste procese fiu sunt ”adoptate” de procesul init. Putem verifica arborele ”genealogic” al proceselor cu comanda pstree.

 ADMINISTRARE PROCESE
 Aflarea PID- ului unui anumit proces individual se face cu  pgrep proces sau pidof proces.
 Logați pe contul de user putem termina doar procesele ce aparțin acelui cont, logați în contul root putem închide procesele oricărui utilizator și/ sau procesele de sistem! Valabil și pentru setare prioritate procese.
 Terminarea unui proces se realizează folosind comanda kill [semnal] PID, în diverse variante, kill 7865, kill -1 7865, kill -9 7865 (înlocuiți 7865, PID- ul dat ca exemplu cu PID- ul corect aflat cu pgrep, pidof). Pentru închiderea tutror instanțelor unei aplicații folosim killall nume-aplicație (killall konsole sau killall firefox). Linux are 3 tipuri de semnale principale pentru terminarea proceselor:
SIGTERM (15), varianta implicită dacă nu specificăm altceva, varianta sigură din punct de vedere al salvării informațiilor;
SIGHUP (1), varianta care va reîncărca fișierele de configurare specifice și va redeschide fișiere log;
SIGKILL (9), varianta dură, brutală, închidere imediată fără salvarea datelor.
 Puteți vedea toate tipurile de semnal trimise de kill cu comanda kill -l.
 Detalii:  http://en.wikipedia.org/wiki/Unix_signal#POSIX_signals

Exemple:
kill 234 (este similar cu kill -15 234 și kill -SIGTERM 234)
kill -9 235 (același lucru cu kill -SIGKILL 235)
kill -1 890 (echivalent cu kill -SIGHUP 890)
killall -9 kwrite (va închide toate instanțele editorului kwrite)
kill -9 pid1 pid2 pid3 ... pidn (putem termina mai multe procese odată)



 Putem închide aplicații din terminal și fără a cunoaște PID- ul acestora folosind pkill nume-aplicație, dar asta presupune să cunoaștem numele exact al aplicației, pkill firefox, pkill dolphin, pkill kwrite, pkill htop, pkill konsole, pkill yakuake,  șamd. Dacă avem mai multe instanțe ale unei aplicații, pkill le va închide pe toate, similar cu killall.
Putem închide chiar interfața grafică cu pkill, condiția este să fim logați ca root sau să folosim sudo:
pkill X

 În htop putem termina procesele selectând un proces cu tastele săgeți, apăsăm tasta F9 (Kill), alegem un tip de semnal (SIGTERM, SIGKILL, șamd) și apăsam Enter pentru terminare, sau Esc pentru renunțarea la terminare, e posibil să fi selectat greșit procesul...


  În utilitarele grafice puteți ordona afișarea după nume, PID, resurse, șamd, puteți închide procese cu clic dreapta pe acestea- End Process- End (sau în funcție de utilitar Ok or ce mai afișează...). Mai simplu bifăm procesul, apăsăm Del și apoi Enter.

 ZOMBIE
 Zâmbiți? Numele e sugestiv, e vorba de așa numiții morți vii, ca-n filmele horror. E vorba de procese terminate, ”ucise”, dar care sunt încă în tabela de procese.
 Putem vedea procesele zombie în top (e afișat numărul acestora în partea de sus), în htop (în coloana S, Status sunt notate cu Z), cu comanda:
 ps aux | awk '{ print $8 " " $2 }' | grep -w Z
Nu consumă resurse, nu sunt periculoase, dar ocupă PID-uri ce-ar putea fi alocate altor procese. În mod normal kill nu are efect, nu poți ucide morții, sunt deja morți, dar putem trimite semnal de închidere către procesul ”părinte”:
kill -17 PID-părinte-zombie
kill -SIGCHLD PID-părinte-zombie

 Dacă nu funcționează putem termina procesul părinte, astfel procesele zombie sunt preluate de procesul init, care le va închide.
 Alternativ le închidem cu comanda:
kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

 PRIORITATE PROCESE/ NICENESS
  Procesele se pot categorisi în funcție de gradul de importanță, unele au prioritate ridicată la resurse, altele scăzută, prioritatea se stabilește după o scară de la -19/-20 (prioritate ridicată) la 19/20 (prioritate scăzută) și este denumită niceness. Procesele cu prioritate scăzută nu folosesc resurse agresiv, se mulțumesc cu resurse minime, așteaptă momentul când pot consuma, deci sunt amabile, binevoitoare (nice), cele cu prioritate mare consumă resurse prioritar, nu stau la coadă, deci nu prea-s amabile...
 Prioritatea proceselor este vizibilă în utilitarul grafic al tabelei de procese (ksysguard, xfce4-taskmanager, șamd), top/ htop, în coloane notate NI/ Niceness, Prio/ Priority, etc, în funcție de utilitar.
 Putem stabili la lansarea în execuție a unui program nivelul de prioritate/ niceness:
nice -n 1 nume-comandă
nice -n -10 nume-comandă
nice -n -4 mc
 Putem schimba gradul de prioritate al unui proces existent:
renice -n 0 PID-proces
renice -n -7 PID-proces
renice -n 2 3798  (3798= PID ktorrent, un exemplu)

 În htop putem crește sau micșora nivelul priorității unui proces selectând acel proces prin navigare cu tastele săgeți, și apăsând F7 pentru creștere prioritate sau F8 pentru scădere prioritate.
 În ksysguard setăm prioritatea cu clic dreapta pe proces, Set priority (sau bifare proces- F8), alegem ce dorim. 
 În xfce4-taskmanager setăm niceness cu clic dreapta pe proces, Set priority și alegem între Very low, Low, Normal High, Very high.


Back to top