This shows you the differences between two versions of the page.
uso:laboratoare:new:02-procese [2018/10/09 20:52] razvan.deaconescu |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 02: Procese ====== | ||
- | |||
- | ===== 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 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> | ||
- | |||
- | ===== Recapitulare ===== | ||
- | |||
- | - Afișați recursiv, pornind din directorul ''uso.git'', toate fișiere și directoarele. Puteți alege oricare din variantele învățate anterior. | ||
- | - Creați o arhivă cu fișierele menționate mai sus. | ||
- | ===== 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 directoare. 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) | ||
- | ===== Need to Know ===== | ||
- | |||
- | === Foreground & Background (&, fg, bg, jobs) === | ||
- | |||
- | Vom folosi ca exemplu programul bg-proc.sh. Acesta afișează în fiecare secundă câte un mesaj "Tick" sau "Tock". Pornim programul: | ||
- | |||
- | |||
- | <code bash> | ||
- | student@uso:~/uso/lab04$ ./bg-proc.sh | ||
- | Tick! | ||
- | Tock! | ||
- | Tick! | ||
- | ^C | ||
- | </code> | ||
- | |||
- | L-am terminatt cu **Ctrl+C**: | ||
- | |||
- | Îl pornim din nou și de data asta îl oprim cu **Ctrl+Z**. Ce observăm? | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso/lab04$ ./bg-proc.sh | ||
- | Tick! | ||
- | Tock! | ||
- | Tick! | ||
- | ^Z | ||
- | [1]+ Stopped ./bg-proc.sh | ||
- | </code> | ||
- | |||
- | Verficăm dacă procesul încă există în sistem: | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso/lab04$ ps aux | ||
- | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
- | root 1 0.0 0.3 160140 7152 ? Ss oct08 0:03 /sbin/init splash | ||
- | root 2 0.0 0.0 0 0 ? S oct08 0:00 [kthreadd] | ||
- | [...] | ||
- | **student 23597 0.0 0.1 21532 3532 pts/0 T 09:53 0:00 /bin/bash ./bg-proc.sh** | ||
- | student 23600 0.0 0.0 16116 780 pts/0 T 09:53 0:00 sleep 1 | ||
- | student 23601 0.0 0.1 46012 3784 pts/0 R+ 09:53 0:00 ps aux | ||
- | </code> | ||
- | |||
- | Pentru a reporni procesul avem 2 variante: | ||
- | - Pornim procesul în mod **interactiv** folosind comanda **bg**. Asta înseamnă că noi putem da comenzi, chiar dacă în fundal este un proces care afișează text | ||
- | - Pornim procesul în mod **neinteractiv** folosind comanda **fg**. Asta înseamnă că procesul oprit anterior a revenit în prim-plan în terminal. Nu vom putea da alte comenzi. | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso/lab04$ ./bg-proc.sh | ||
- | Tick! | ||
- | Tock! | ||
- | |||
- | [1]+ Stopped ./bg-proc.sh | ||
- | student@uso:~/uso/lab04$ bg | ||
- | [1]+ ./bg-proc.sh & | ||
- | student@uso:~/uso/lab04$ Tick! | ||
- | Tock! | ||
- | lsTick! | ||
- | |||
- | batman.sh bg-proc.sh it-s-a-trap.sh | ||
- | student@uso:~/uso/lab04$ Tock! | ||
- | Tick! | ||
- | Tock! | ||
- | ^C | ||
- | student@uso:~/uso/lab04$ Tick! | ||
- | Tock! | ||
- | </code> | ||
- | |||
- | Puteți observa că am încercat să termin programul folosind **Ctrl+C**. Acest lucru nu a fost posibil pentru că acesta rula în fundal. Pentru asta trebuie să aducem procesul în prim-plan și să îl terminăm sau să îi aflăm PID-ul și să-l terminăm folosind utilitarul **kill**. | ||
- | |||
- | == Exerciții == | ||
- | - Porniți programul **bg-proc.sh**. | ||
- | - Treceți-l în starea ''foreground'' și apoi în background. | ||
- | - Terminați procesul cu **Ctrl+C** și cu utilitarul **kill** | ||
- | - Faceți același lucru și cu programul **it-s-a-trap.sh** | ||
- | |||
- | |||
- | === Redirectare === | ||
- | |||
- | Pentru a redirecta lista proceselor într-un fișier, folosim următoarea comandă: | ||
- | |||
- | <code bash> | ||
- | student@uso:~$ ps aux > procese.txt | ||
- | </code> | ||
- | |||
- | Un alt exemplu de redirectare este: | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso/lab04$ echo "prima linie din fisier" > fis.txt | ||
- | student@uso:~/uso/lab04$ cat fis.txt | ||
- | prima linie din fisier | ||
- | student@uso:~/uso/lab04$ echo "a2a linie din fisier" >> fis.txt | ||
- | student@uso:~/uso/lab04$ cat fis.txt | ||
- | prima linie din fisier | ||
- | a2a linie din fisier | ||
- | student@uso:~/uso/lab04$ echo "a3a linie din fisier" > fis.txt | ||
- | student@uso:~/uso/lab04$ cat fis.txt | ||
- | a3a linie din fisier | ||
- | </code> | ||
- | |||
- | Putem observa că la a3a linie am folosit **>** în loc de **>>** și am șters conținutul anterior al fișierului. | ||
- | |||
- | === Comunicare interprocese, folosind | === | ||
- | |||
- | Putem căuta după un anumit proces din sistem astfel: | ||
- | |||
- | <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> | ||
- | |||
- | Care este logica din spatele comenzii? În loc să ne afișeze nouă pe ecran rezultatul comenzii **ps aux**, acesta a fost transmis către următoarea comandă **grep**. Comanda din urmă a căutat cuvântul ''sleep'' în rezultatul comenzi ''ps aux''. | ||
- | |||
- | Un alt exemplu: | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso$ ls -lR | grep "hello" | ||
- | -rw-r--r-- 1 student student 72 sep 10 12:25 hello.c | ||
- | -rw-r--r-- 1 student student 72 sep 10 12:25 hello.c | ||
- | -rw-r--r-- 1 student student 154 sep 10 12:25 hello.c | ||
- | -rw-r--r-- 1 student student 95 sep 10 12:25 simple_hello.c | ||
- | -rw-r--r-- 1 student student 580 sep 10 12:25 hello.s | ||
- | -rw-r--r-- 1 student student 1192 sep 10 12:25 hello.o | ||
- | -rw-r--r-- 1 student student 15 sep 10 12:25 hello.h | ||
- | -rw-r--r-- 1 student student 64 sep 10 12:25 hello_0.c | ||
- | -rw-r--r-- 1 student student 82 sep 10 12:25 hello_1.c | ||
- | -rw-r--r-- 1 student student 111 sep 10 12:25 hello_2.c | ||
- | -rw-r--r-- 1 student student 83 sep 10 12:25 hello_3.c | ||
- | -rw-r--r-- 1 student student 142 sep 10 12:25 hello_4.c | ||
- | -rw-r--r-- 1 student student 145 sep 10 12:25 hello_5.c | ||
- | -rw-r--r-- 1 student student 150 sep 10 12:25 hello_6.c | ||
- | -rw-r--r-- 1 student student 162 sep 10 12:25 hello_7.c | ||
- | -rw-r--r-- 1 student student 16 sep 10 12:25 hello.h | ||
- | lrwxrwxrwx 1 student student 7 sep 10 12:25 hello_from_the_other_side.h -> hello.h | ||
- | </code> | ||
- | |||
- | Am afișat recursiv (-R) directorul **uso** și am transmis rezultatul către utilitarul **grep** pentru a căuta fișierele ce conțin cuvântul ''hello''. | ||
- | |||
- | == Exerciții == | ||
- | - Afișați recursiv toate fișierele și directoarele din **uso.git**, redirectând totul într-un fișier. Înspectați fișierul pentru verificare. | ||
- | - Înlănțuiți comanda precedentă cu **grep** pentru a căuta în **uso.git** fișierele ce conțin cuvântul **lab** | ||
- | ===== Nice to Know ===== | ||
- | |||
- | === Valori de eroare === | ||
- | |||
- | Putem verifica dacă comanda executată anterior s-a executat cu succes folosind **$?**: | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso$ cat README.md | ||
- | uso | ||
- | === | ||
- | |||
- | * Directorul ''lab02'' conține toate fișierele și structura de directoare necesare rezolvării laboratorului 2 de către studenți | ||
- | student@uso:~/uso$ echo $? | ||
- | 0 | ||
- | student@uso:~/uso$ cat fisier-care-nu-exista.txt | ||
- | cat: fisier-care-nu-exista.txt: No such file or directory | ||
- | student@uso:~/uso$ echo $? | ||
- | 1 | ||
- | </code> | ||
- | |||
- | Atunci când valoarea este **0**, procesul s-a executat cu succes. Orice diferit de 0 este o eroare. | ||
- | |||
- | === Exerciții === | ||
- | - Încercați să afișați un fișier ce nu există. Ce cod de eroare primiți? | ||
- | - Încercați să rulați o comandă cu parametri aleatori (ex: ps -ewqgew). Ce cod de eroare primiți? | ||
- | |||
- | === Structura arborescentă a proceselor === | ||
- | |||
- | Afișăm toate procesele din sistem cu atributele PID, PPID, CMD: | ||
- | |||
- | <code bash> | ||
- | student@uso:~/uso$ ps ax -o pid,ppid,cmd | ||
- | PID PPID CMD | ||
- | 1 0 /sbin/init splash | ||
- | [...] | ||
- | 19540 2 [jfsSync] | ||
- | 22046 2 [kworker/0:1] | ||
- | 22090 900 /usr/lib/gnome-terminal/gnome-terminal-server | ||
- | 22101 22090 bash | ||
- | 22114 22090 bash | ||
- | 22234 1 /usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-map | ||
- | 22559 1 /usr/sbin/cupsd -l | ||
- | 22560 1 /usr/sbin/cups-browsed | ||
- | 22742 2 [loop10] | ||
- | 22785 1 /usr/lib/snapd/snapd | ||
- | 22913 2 [loop12] | ||
- | 23200 2 [kworker/u2:0] | ||
- | 23394 530 /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/dhclient-enp0s8.pid -lf /var/lib/NetworkManager/dhclient-fda81623-2338-36f | ||
- | 23519 2 [kworker/u2:1] | ||
- | 23974 2 [kworker/u2:2] | ||
- | 24107 22101 ps ax -o pid,ppid,cmd | ||
- | </code> | ||
- | |||
- | Putem observa că părintele comenzii executate de noi este **bash**; are PID-ul 22101. | ||
- | |||
- | == Exerciții == | ||
- | - Pornind de la tutorialul de mai sus, urmăriți PID-ul și PPID-ul procesului ''ps'', **recursiv** | ||
- | - Faceți asta cu 2-3 procese. Unde se opresc toate procesele? | ||
- | |||
- | |||
- | ===== Get a Life ===== | ||
- | |||
- | == Exerciții == | ||
- | |||
- | **1.** Procese detașate de terminal | ||
- | |||
- | Pentru acest exercițiu avem nevoie de pachetul **transmission-cli**. Îl putem instala folosind comanda: | ||
- | |||
- | <code bash> | ||
- | student@eg306:~$ sudo apt-get install transmission-cli | ||
- | </code> | ||
- | |||
- | Folosiți Transmission în linie de comandă pentru a descărca o imagine de Ubuntu, [[http://releases.ubuntu.com/17.04/ubuntu-17.04-desktop-amd64.iso.torrent?_ga=2.179407716.1129929276.1508229525-1809341997.1504894444|de aici]]. Descărcați fișierul .torrent în ''/home/student/Downloads''. | ||
- | |||
- | <code bash> | ||
- | student@midgard:~$ transmission-cli ~/Downloads/ubuntu-17.04-desktop-amd64.iso.torrent | ||
- | </code> | ||
- | |||
- | Dintr-un alt terminal determinați PID-ul acestui proces. Închideți terminalul din interfața grafică (X din colțul din dreapta sus). Căutați din nou procesul după identificator. | ||
- | |||
- | **1.1** Ce s-a întâmplat cu procesul nostru transmission-cli tocmai creat? Care credeți că este cauza? | ||
- | |||
- | Deschideți din nou un terminal, dar de data folosiți-vă de comanda **nohup** (man nohup) pentru a lansa procesul ''transmission-cli'' pentru descărcarea imaginii de Ubuntu. Închideți din nou terminalul din interfața grafică. Observați că procesul rămâne în viață. Determinați PID-ul acestui proces. | ||
- | |||
- | **1.2** Ce fel de semnal se generează atunci când închidem terminalul și pe care a doua oară procesul transmission-gtk îl ignoră? | ||
- | |||
- | |||
- | |||
- | |||
- | **2.** Trimiterea de semnale unui proces | ||
- | |||
- | Mergeți în directorul ''support'' aferent laboratorului unde găsiți scriptul ''batman.sh''. | ||
- | |||
- | Rulați-l. Procesul interceptează toate semnalele cu indecși de la 1 la 13, mai puțin 9 (din motive evidente). De fiecare dată când primește un semnal cu indexul între 1 și 13 el afișează pe ecran un caracter. Mai jos aveți maparea dintre indecșii semnalelor și caracterul afișat: | ||
- | |||
- | <columns 50% 50% -> | ||
- | |||
- | ^Index semnal ^ Caracter ^ | ||
- | | 1 | o | | ||
- | | 2 | u | | ||
- | | 3 | c | | ||
- | | 4 | d | | ||
- | | 5 | e | | ||
- | | 6 | z | | ||
- | |||
- | <newcolumn> | ||
- | |||
- | ^Index semnal ^ Caracter ^ | ||
- | | 7 | s | | ||
- | | 8 | h | | ||
- | | 10 | (space) | | ||
- | | 11 | r | | ||
- | | 12 | k | | ||
- | | 13 | l | | ||
- | |||
- | </columns> | ||
- | |||
- | **2.1** Într-un alt terminal aflați pid-ul procesului și trimiteți-i semnale astfel încât procesul să afișeze pe ecran șirul de caractere ''uso rullz''. | ||
- | |||
- | |||