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.