This is an old revision of the document!
Comanda strace (system call trace) ne este utilă pentru a investiga ce apeluri de sistem efectuează o comandă dată și ce parametri folosește.
De exemplu, dacă dorim să urmărim apelurile de sistem efectuate de comanda ls folosim comanda
strace ls
Output-ul fiind destul de vast, ne preocupă să obținem doar informații despre fișierele deschide. Pentru aceasta folosim opțiunea -e a comenzii strace cu ajutorul căreia filtrăm tipuri de operații. În cazul de față folosim comanda
strace -e file ls
Observăm fișierele deschise.
Pentru a vedea diferența între comenzile ls și ls -l folosim comanda
strace -e file ls -l
Observăm că acum deschise și fișiere precum /etc/passwd și /etc/group pentru a determina username-ul și grupul aferent UID-ului și GID-ului din fișier.
Comanda
netstat -s
afișează informații statistice despre pachetele sistemului. Ne interesează să știm de unde obține comanda respectivă informațiile.
Rulați comanda
strace -e open netstat -s
pentru a afla ce fișiere deschide comanda la rulare.
Care fișier este citit pentru a afla informații despre pachetele primite (packets received)? Vizualizați acel fișier (luați-o pe încercate).
strace permite investigarea unui proces aflat deja în rulare. Numim acest lucru atașarea la un proces. Putem astfel investiga apelurile de sistem efectuate de un proces aflat în rulare și diagnostica anumite probleme ale acestuia. Pentru a ne putea atașa la un proces avem nevoie de PID-ul acestuia.
Deschideți două tab-uri de terminal (adică să aveți două deschise; dacă aveți deja unul mai deschideți încă unul).
Ctrl+Shift+t.
Într-unul dintre tab-uri aflați PID-ul procesului curent (a shell-ului) folosind comanda
echo $$
Pentru a investiga shell-ul, din celălalt tab folosim comanda
strace -p <PID>
unde <PID> este PID-ul shell-ului determinat mai sus.
Acum dacă în celălalt shell rulăm comenzi vom vedea ce se întâmplă în cadrul shell-ului.
Observăm că se folosește apelul de sistem clone pentru a crea un nou proces, dar nu apare apelul de sistem execve care înlocuiește imaginea de proces. Pentru a vedea aceste apeluri de sistem trebuie să precizăm comenzii strace să investigheze și procesele copil folosind opțiunea -f (de la follow children). Astfel, vom putea investiga folosind comanda
strace -f -p <PID>
Dacă dorim să vedem doar operațiile cu procese și fișiere, de exemplu, vom folosi pentru investigație comanda
strace -f -e process,file -p <PID>
Sunt cazuri în care dorim să pornim procese detașate de terminal. Adică după pornirea procesului să închidem terminalul și procesul să nu fie “omorât” ci să își încheie execuția. Aceste procese sunt echivalente unor procese daemon.
Pentru a detașa un proces de un terminal se folosesc comenzi precum nohup, dtach și disown.
Folosiți comanda wget pentru a descărca fișierul .torrent de aici.
Porniți un proces BitTorrent folosind comanda:
btdownloadheadless lin-prog.torrent
btdownloadheadless instalat pe sistem instalați pachetul bittorrent
sudo apt-get install bittorrent
sau pachetul bittornado
sudo apt-get install bittornado
Transferați procesul pornit în starea de rulare în background. Detașați procesul de terminal folosind comanda disown. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda lsof pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
Apoi încheiați execuția acelui proces.
Folosiți comanda nohup pentru a crea un proces BitTorrent precum cel de mai sus, detașat de terminal. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda lsof pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
Trimiteți un semnal procesului pentru a-i încheia execuția și apoi reporniți-l sub nohup astfel încât ieșirea standard (standard output, stdout) să fie redirectată la /dev/null iar ieșirea de eroare standard (standard error, stderr) să fie redirectată în fișierul err.log. Investigați cu lsof unde pointează descriptorii standard ai procesului.