This shows you the differences between two versions of the page.
sde:laboratoare:05_ro_procese [2020/03/17 16:50] ioana_maria.culic |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | =====Înainte de laborator===== | ||
- | |||
- | ==== Utilizare terminal ==== | ||
- | |||
- | Pentru a deschide un terminal nou: | ||
- | |||
- | ^ Scurtătură ^ Descriere ^ | ||
- | | **''Ctrl+Alt+t''** | pentru a deschide o nouă fereastră de terminal | | ||
- | |||
- | Puteți folosi următoarele scurtături în terminal: | ||
- | |||
- | ^ Scurtătură ^ Descriere ^ | ||
- | | **''Ctrl+Shift+t''** | pentru a deschide un nou tab | | ||
- | | **''Ctrl+PageDown''** | pentru a merge la tab-ul următor | | ||
- | | **''Ctrl+PageUp''** | pentru a merge la tab-ul precedent | | ||
- | | **''Alt+<index>''** | pentru a sări direct la un tab | | ||
- | | **''Ctrl+d''** | pentru a închide un tab (sau comanda **''exit''**) | | ||
- | |||
- | Pentru a naviga (scrolling) în cadrul unui terminal, mai ales atunci când o comandă afișează mult text, folosiți următoarele scurtături: | ||
- | |||
- | ^ Scurtătură ^ Descriere ^ | ||
- | | **''Shift+PgDown''** | pentru a derula în jos | | ||
- | | **''Shift+PgUp''** | pentru a derula în sus | | ||
- | |||
- | Alte scurtături utile: | ||
- | |||
- | ^ Scurtătură ^ Descriere ^ | ||
- | | **''Ctrl+Shift+c''** | copiere text din terminal | | ||
- | | **''Ctrl+Shift+v''** | lipire text în terminal | | ||
- | | **''Shift+Insert''** | lipire text în terminal | | ||
- | |||
- | ==== Navigarea în paginile de manual ==== | ||
- | |||
- | Paginile de manual sunt adesea de mari dimensiuni și avem nevoie să le parcurgem rapid (să navigăm prin ele). Pentru aceasta, după ce deschidem pagina de manual a unei comenzi, putem folosi combinațiile de taste de mai jos pentru a naviga în pagină: | ||
- | |||
- | ^ Tastă ^ Scurtă descriere ^ | ||
- | | /string_to_search | ''/'' (adică tasta //slash//) e folosită pentru a căuta **''string_to_search''** în pagina de manual | | ||
- | | **''n''** (next) | pentru a merge la următoarea apariție a cuvântului căutat cu / | | ||
- | | **''N''** (Shift + n) | pentru a merge la precedenta apariție a cuvântului | | ||
- | | **''q''** (quit) | pentru a închide pagina de manual | | ||
- | | **''Enter''** | pentru a derula în jos o linie | | ||
- | | **''f''** (forward) sau **''Space''** | pentru a derula în jos un ecran | | ||
- | | **''b''** (backward) | pentru a derula în sus un ecran | | ||
- | | **''d''** (down) | pentru a derula în jos jumătate de ecran | | ||
- | | **''u''** (up) | pentru a derula în sus jumătate de ecran | | ||
- | |||
- | ==== Suport laborator ==== | ||
- | |||
- | Pentru a obține informații detaliate despre noțiunile și tehnicile din acest laborator, recomandăm să consultați [[http://elf.cs.pub.ro/uso/res/carte/uso_cap-04-process.pdf|capitolul corespunzător din cartea de USO]]. | ||
- | |||
- | ==== Obiective ==== | ||
- | |||
- | * Înțelegerea conceptelor legate de procese | ||
- | * Dobândirea de competențe de monitorizare și interacțiune cu procesele | ||
- | * Obținerea de abilități de lucru cu utilitare și comenzi Linux | ||
- | * Obținerea de noțiuni de bază legate de comunicarea inter-proces: pipe-uri și semnale | ||
- | ==== Pe scurt despre Git ==== | ||
- | |||
- | Pe parcursul laboratoarelor, pentru descărcarea fișierelor necesare laboratorului, vom folosi Git. Git este un sistem de controlul versiunii și e folosit pentru versionarea codului în proiectele software mari. Celor interesați să aprofundeze conceptele din spatele comenzii ''git'', precum și utilizări avansate, le recomandăm cursul practic online de pe [[http://gitimmersion.com/|gitimmersion]]. | ||
- | |||
- | Informațiile despre laboratorul de USO se găsesc în [[https://github.com/systems-cs-pub-ro/uso-lab|acest repository Git]]. | ||
- | |||
- | <note important> | ||
- | Pentru a pregăti infrastructura de laborator rulați comenzile de mai jos într-un terminal. Deschideți un terminal folosind combinația de taste ''Ctrl+Alt+t''. În listarea de mai jos ''student@uso:~$'' este promptul unde introduceți comenzile, pe acela nu-l tastați. | ||
- | |||
- | <code> | ||
- | student@uso:~$ cd ~ | ||
- | student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso-lab.git | ||
- | </code> | ||
- | |||
- | </note> | ||
- | |||
- | Cam atât cu pregătirea laboratorului. Acum haideți să ne apucăm de treabă! :-) | ||
- | |||
- | ===== Concepte ===== | ||
- | |||
- | ==== Vizualizarea proceselor din sistem (ps, pstree, top, htop) ==== | ||
- | |||
- | Ierarhia de procese în Linux este sub formă arborescentă; putem vizualiza folosind ''pstree'' (similar cu ''tree'' de la sistemul de fișiere) | ||
- | |||
- | Folosind ''ps'' fără nici un parametru vizualizăm procesele din shell-ul curent asociate utilizatorului curent. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps | ||
- | PID TTY TIME CMD | ||
- | 22101 pts/0 00:00:00 bash | ||
- | 22209 pts/0 00:00:00 ps | ||
- | </code> | ||
- | |||
- | Tot cu ''ps'' putem vizualiza un ''snapshot'' al tuturor proceselor. Aceasta se poate obține folosind două variante ale comenzii: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | root 1 0.0 0.3 160140 7044 ? Ss 10:39 0:02 /sbin/init spla | ||
- | root 2 0.0 0.0 0 0 ? S 10:39 0:00 [kthreadd] | ||
- | [...] | ||
- | student 22101 0.0 0.2 31236 5192 pts/0 Ss 19:38 0:00 bash | ||
- | student 22114 0.0 0.2 31236 5008 pts/1 Ss+ 19:38 0:00 bash | ||
- | root 22151 0.0 0.3 25656 6260 ? S 19:40 0:00 /sbin/dhclient | ||
- | student 22191 0.0 0.1 46012 3656 pts/0 R+ 19:48 0:00 ps aux | ||
- | </code> | ||
- | |||
- | Un utilitar echivalent lui Windows Task Manager pentru vizualizarea în timp real a proceselor care rulează, în linie de comandă, este htop. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ htop | ||
- | </code> | ||
- | |||
- | ==== Atributele unui proces ==== | ||
- | |||
- | Procesul este identificat în sistem cu ajutorul unui număr numit **PID** (process ID). Acesta este unic în sistem. Atunci când un proces este creat, se asignează un PID nou, următorul crescător liber. | ||
- | |||
- | Un alt atribut important este PID-ul procesului părinte, **PPID**. Având o structură ierarhică, toate procesele au un părinte, părintele tuturor fiind **init** sau **systemd** (în funcție de sistem) și are PID-ul 1. | ||
- | |||
- | Atributul **COMMAND** ne spune numele procesului sau comanda cu care a fost creat: | ||
- | <code bash> | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | student 23176 0.0 0.1 46012 3644 pts/0 R+ 22:06 0:00 ps aux | ||
- | </code> | ||
- | |||
- | Pentru o listă completă de atribute, verificați **manualul**. | ||
- | |||
- | ==== Foreground & Background (&, fg, bg, jobs) ==== | ||
- | |||
- | Există mai multe stări în care un proces se poate afla: | ||
- | - Starea în care rulează | ||
- | - Starea în care este oprit: se folosește **Ctrl+Z** | ||
- | - Starea în care este terminat (procesul nu mai există): se folosește **Ctrl+C** | ||
- | |||
- | Apăsând o combinație de taste din cele de mai sus, trimitem un semnal procesului: | ||
- | |||
- | ^ Taste ^ Semnificație ^ | ||
- | | **''Ctrl+C''** | trimite ''SIGINT'' | | ||
- | | **''Ctrl+Z''** | trimite ''SIGSTOP'' | | ||
- | | **''Ctrl+\''** | trimite ''SIGQUIT'' | | ||
- | |||
- | În secțiunea **Demo** exemplificăm cum se trece prin aceste stări. | ||
- | |||
- | ==== Semnale (kill) ==== | ||
- | |||
- | Un utilizator poate trimite un semnal unui proces folosind comanda kill! Este foarte important să înțelegem că scopul principal al utilitarului nu este omorârea de procese, deși poate face și asta. O listă a tuturor semnalelor posibile ce pot fi trimise aflăm prin | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ kill -l | ||
- | </code> | ||
- | |||
- | Utilitarele **pkill** și **killall** termină procesele folosind ca argument **numele** procesului și nu PID-ul (ca la **kill**). | ||
- | |||
- | ==== Redirectare (>, >>, <, |) ==== | ||
- | |||
- | Redirectare stdout (standard output, în general mesaje afișate prin comenzi similare cu printf din C). Pentru a redirecta lista proceselor într-un fișier, folosim următoarea comandă: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux > procese.txt | ||
- | </code> | ||
- | |||
- | Astfel, am specificat procesului să nu mai afișeze rezultatul pe ecran, ci într-un fișier. Diferența între **>** și **>>** este că primul înlocuiește conținutul fișierului **procese.txt**, pe când al2lea adaugă la sfârșitul fișierului. | ||
- | |||
- | Operatorul **<** folosit ''comanda < fisier.txt'' setează comenzii intrarea ''fisier.txt''. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ grep "Disable" < vm-actions-log.txt | ||
- | * Disable terminal bell and scrolling in terminal: | ||
- | * Disable cursor blinking in terminal: | ||
- | * Disable DNS usage in SSH server: | ||
- | * Disable automated screen locking: | ||
- | </code> | ||
- | |||
- | ==== Comunicarea interprocese, folosind pipe | ==== | ||
- | Operatorul **|** este foarte important și uzual folosit. Acesta ia rezultatul primei comenzi și îl oferă ca intrare la a2a comandă. Câteva exemple: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux | grep sleep | ||
- | student 22406 0.0 0.0 16116 828 pts/0 S 20:28 0:00 sleep 1000 | ||
- | student 22408 0.0 0.0 23076 1084 pts/0 S+ 20:28 0:00 grep --color=auto sleep | ||
- | </code> | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ tree | grep Documents | ||
- | ├── Documents | ||
- | </code> | ||
- | |||
- | Se pot înlănțui 2 sau mai multe comenzi. | ||
- | |||
- | ==== Procesele daemon ==== | ||
- | |||
- | Procesele daemon sunt procese ce rulează în fundal. De obicei, acestea sunt servicii ce servesc anumite funcții specifice. Acestea pot fi recunoscute ca având procesul părinte cu PID 1 (procesul init sau systemd). | ||
- | |||
- | ===== Demo ===== | ||
- | |||
- | ==== Vizualizarea proceselor din sistem (ps, pstree, top, htop) ==== | ||
- | |||
- | Folosind ''ps'' fără nici un parametru vizualizăm procesele din shell-ul curent asociate utilizatorului curent. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps | ||
- | PID TTY TIME CMD | ||
- | 22101 pts/0 00:00:00 bash | ||
- | 22209 pts/0 00:00:00 ps | ||
- | </code> | ||
- | |||
- | Tot cu ''ps'' putem vizualiza un ''snapshot'' al tuturor proceselor. Aceasta se poate obține folosind două variante ale comenzii: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | root 1 0.0 0.3 160140 7044 ? Ss 10:39 0:02 /sbin/init spla | ||
- | root 2 0.0 0.0 0 0 ? S 10:39 0:00 [kthreadd] | ||
- | [...] | ||
- | student 22101 0.0 0.2 31236 5192 pts/0 Ss 19:38 0:00 bash | ||
- | student 22114 0.0 0.2 31236 5008 pts/1 Ss+ 19:38 0:00 bash | ||
- | root 22151 0.0 0.3 25656 6260 ? S 19:40 0:00 /sbin/dhclient | ||
- | student 22191 0.0 0.1 46012 3656 pts/0 R+ 19:48 0:00 ps aux | ||
- | </code> | ||
- | |||
- | Un utilitar echivalent lui Windows Task Manager pentru vizualizarea în timp real a proceselor care rulează, în linie de comandă, este **htop**. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ htop | ||
- | </code> | ||
- | |||
- | ==== Atributele unui proces ==== | ||
- | |||
- | În mod implicit, când afișăm procesele, ni se arată următoarele atribute: | ||
- | <code bash> | ||
- | student@uso:~$ ps aux | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | [...] | ||
- | </code> | ||
- | |||
- | Putem specifica ce atribute să ne afișeze și în ce ordine dorim: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps -ax -o ppid,pid,cmd | ||
- | PPID PID CMD | ||
- | 0 1 /sbin/init splash | ||
- | 0 2 [kthreadd] | ||
- | [...] | ||
- | </code> | ||
- | |||
- | |||
- | Pentru a selecta doar procesele pornite de utilizatorul student: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps -f -u student | ||
- | UID PID PPID C STIME TTY TIME CMD | ||
- | student 900 1 0 11:10 ? 00:00:00 /lib/systemd/systemd --user | ||
- | student 901 900 0 11:10 ? 00:00:00 (sd-pam) | ||
- | [...] | ||
- | </code> | ||
- | |||
- | ==== Foreground & Background (&, fg, bg, jobs) ==== | ||
- | |||
- | Vom folosi ca exemplu utilitarul ''sleep''. Trebuie să știm dacă procesul nostru rulează sau nu. Pentru a verifica acest lucru, dintr-un alt terminal, ne folosim de utilitarul ''ps'': | ||
- | |||
- | Terminal 1: | ||
- | <code bash> | ||
- | student@uso:~$ sleep 100 | ||
- | </code> | ||
- | |||
- | Terminal 2: | ||
- | <code bash> | ||
- | student@uso:~$ ps aux | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | root 1 0.0 0.3 160140 7044 ? Ss 10:39 0:02 /sbin/init spla | ||
- | root 2 0.0 0.0 0 0 ? S 10:39 0:00 [kthreadd] | ||
- | [...] | ||
- | student 22268 0.0 0.0 16116 884 pts/0 S 19:54 0:00 sleep 100 | ||
- | student 22281 0.0 0.1 46012 3744 pts/0 R+ 19:54 0:00 ps aux | ||
- | </code> | ||
- | |||
- | Am găsit procesul ''sleep'' în sistem. Putem folosi utilitarul ''pgrep'' pentru a afla PID-ul procesului. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ pgrep sleep | ||
- | 22268 | ||
- | </code> | ||
- | |||
- | Pentru a opri procesul, vom folosi combinația de taste **Ctrl+Z**: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ sleep 100 | ||
- | student@uso:~$ ^Z | ||
- | [1]+ Stopped sleep 100 | ||
- | student@uso:~$ jobs | ||
- | [1]+ Stopped sleep 100 | ||
- | </code> | ||
- | |||
- | Am folosit utilitarul ''jobs'' pentru a vedea ce procese sunt active în terminalul curent. De aici putem folosi **bg** (background) pentru a porni procesul în mod interactiv sau **fg** (foreground) pentru a porni procesul în mod neinteractiv. Mai simplu, la ''bg'' putem da alte comenzi în timp ce programul nostru rulează, iar la ''fg'' nu putem să dăm alte comenzi. | ||
- | |||
- | ==== Semnale (kill) ==== | ||
- | |||
- | Vom folosi în continuare comanda **kill** pentru a trimite semnale proceselor. Această comandă nu omoară neapărat procesul, în ciuda numelui. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ kill --help | ||
- | kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] | ||
- | Send a signal to a job. | ||
- | </code> | ||
- | |||
- | Dintr-un alt terminal aflăm PID-ul procesului ''sleep'' folosind utilitarul **pgrep**. | ||
- | Pentru a termina procesul, trimitem semnalul 9 (SIGKILL): | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ jobs | ||
- | [1]+ Stopped sleep 100 | ||
- | student@uso:~$ pgrep sleep | ||
- | 22286 | ||
- | student@uso:~$ kill -9 22286 | ||
- | student@uso:~$ jobs | ||
- | [1]+ Killed sleep 100 | ||
- | </code> | ||
- | |||
- | Am transmis semnalul 9 (SIGKILL) procesului 22286, iar acesta a fost terminat instant. | ||
- | |||
- | ==== Redirectare ==== | ||
- | |||
- | Pentru a redirecta lista proceselor într-un fișier, folosim următoarea comandă: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux > procese.txt | ||
- | </code> | ||
- | |||
- | Astfel, am specificat procesului să nu mai afișeze rezultatul pe ecran, ci într-un fișier. Diferența între **>** și **>>** este că primul înlocuiește conținutul fișierului **procese.txt**, pe când al2lea adaugă la sfârșitul fișierului. | ||
- | Astfel, executând a2a oară comanda: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux >> procese.txt | ||
- | </code> | ||
- | |||
- | Vom avea în fișierul ''procese.txt'' afișat de 2 ori ieșirea comenzii. | ||
- | |||
- | ==== Comunicare interprocese, folosind | ==== | ||
- | |||
- | Operatorul **|** este foarte important și uzual folosit. Acesta ia rezultatul primei comenzi și îl oferă ca intrare la a doua comandă. Câteva exemple: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux | grep sleep | ||
- | student 22406 0.0 0.0 16116 828 pts/0 S 20:28 0:00 sleep 1000 | ||
- | student 22408 0.0 0.0 23076 1084 pts/0 S+ 20:28 0:00 grep --color=auto sleep | ||
- | </code> | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ tree | grep Documents | ||
- | ├── Documents | ||
- | </code> | ||
- | |||
- | ===== Basics ===== | ||
- | |||
- | ==== Vizualizarea proceselor din sistem (ps, pstree, top, htop) ==== | ||
- | |||
- | Folosind ''ps'' fără nici un parametru vizualizăm procesele din shell-ul curent asociate utilizatorului curent. | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps | ||
- | PID TTY TIME CMD | ||
- | 22101 pts/0 00:00:00 bash | ||
- | 22209 pts/0 00:00:00 ps | ||
- | </code> | ||
- | |||
- | Parametrul **aux** asociat lui **ps** ne arată toate procesele din sistem: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | root 1 0.0 0.3 160140 7044 ? Ss 10:39 0:02 /sbin/init spla | ||
- | root 2 0.0 0.0 0 0 ? S 10:39 0:00 [kthreadd] | ||
- | [...] | ||
- | student 22101 0.0 0.2 31236 5192 pts/0 Ss 19:38 0:00 bash | ||
- | student 22114 0.0 0.2 31236 5008 pts/1 Ss+ 19:38 0:00 bash | ||
- | root 22151 0.0 0.3 25656 6260 ? S 19:40 0:00 /sbin/dhclient | ||
- | student 22191 0.0 0.1 46012 3656 pts/0 R+ 19:48 0:00 ps aux | ||
- | </code> | ||
- | |||
- | ==== Atributele unui proces ==== | ||
- | |||
- | Pentru a selecta doar procesele pornite de utilizatorul student folosim **-u**: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps -f -u student | ||
- | UID PID PPID C STIME TTY TIME CMD | ||
- | student 900 1 0 11:10 ? 00:00:00 /lib/systemd/systemd --user | ||
- | student 901 900 0 11:10 ? 00:00:00 (sd-pam) | ||
- | [...] | ||
- | </code> | ||
- | |||
- | Putem specifica ce atribute să ne afișeze și în ce ordine dorim: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps -ax -o ppid,pid,cmd | ||
- | PPID PID CMD | ||
- | 0 1 /sbin/init splash | ||
- | 0 2 [kthreadd] | ||
- | [...] | ||
- | </code> | ||
- | |||
- | Până a trece mai departe, trebuie să vă asigurați că ați înțeles cum trebuie navigarea printr-o ierarhie de procese. Pentru asta, parcurgeți următoarele exerciții după care verificați cu asistentul că totul este în regulă. | ||
- | - Afișați toate procesele din sistem care să conțină date legate de PID, PID-ul părintelui, user-ul care deține procesul și comanda care a pornit procesul | ||
- | - Filtrați procesele după utilizatorul curent (student) | ||
- | - Afișați procesele în mod interactiv (folosind top/htop) | ||
- | |||