Cum să utilizați comanda Linux lsof

Dacă totul în Linux este un fișier, trebuie să existe mai mult decât fișiere de pe hard disk. Acest tutorial vă va arăta cum să utilizați lsof pentru a vedea toate celelalte dispozitive și procese care sunt gestionate ca fișiere.

Pe Linux, totul este un fișier

Expresia des citată că totul în Linux este un fișier este oarecum adevărată. Un fișier este o colecție de octeți. Când sunt citite într-un program sau trimise la o imprimantă, par să genereze un flux de octeți. Când li se scrie, acceptă un flux de octeți.

Multe alte componente ale sistemului acceptă sau generează fluxuri de octeți, cum ar fi tastaturi, conexiuni socket, imprimante și procese de comunicare. Deoarece fie acceptă, generează, fie acceptă și generează fluxuri de octeți, aceste dispozitive pot fi gestionate — la un nivel foarte scăzut — ca și cum ar fi fișiere.

Acest concept de design a simplificat implementarea sistemului de operare Unix. Însemna că un set mic de handlere, instrumente și API-uri ar putea fi creat pentru a gestiona o gamă largă de resurse diferite.

Fișierele de date și de program care se află pe hard disk sunt fișiere simple de sistem de fișiere vechi. Putem folosi comanda ls pentru a le enumera și pentru a afla câteva detalii despre ele.

Cum aflăm despre toate celelalte procese și dispozitive care sunt tratate ca și cum ar fi fișiere? Folosim comanda lsof. Aceasta listează fișierele deschise în sistem. Adică, listează orice lucru care este gestionat ca și cum ar fi un fișier.

Comandamentul lsof

Multe dintre procesele sau dispozitivele despre care lsof poate raporta aparțin root sau au fost lansate de root, așa că va trebui să utilizați comanda sudo cu lsof.

Și pentru că această listă va fi foarte lungă, vom trece prin mai puțin.

sudo lsof | less

Înainte ca rezultatul lsof să apară, utilizatorii GNOME pot vedea un mesaj de avertizare în fereastra terminalului.

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

lsof încearcă să proceseze toate sistemele de fișiere montate. Acest mesaj de avertizare este lansat deoarece lsof a întâlnit o Sistem de fișiere virtual GNOME (GVFS). Acesta este un caz special de a sistem de fișiere în spațiul utilizatorului (SIGURANȚĂ). Acționează ca o punte între GNOME, API-urile sale și kernel. Nimeni – nici măcar root – nu poate accesa unul dintre aceste sisteme de fișiere, în afară de proprietarul care l-a montat (în acest caz, GNOME). Puteți ignora acest avertisment.

Ieșirea de la lsof este foarte largă. Coloanele din stânga sunt:

Coloanele din dreapta sunt:

Lsof Coloane

Toate coloanele nu se aplică fiecărui tip de fișier deschis. Este normal ca unele dintre ele să fie goale.

Comanda: numele comenzii asociate cu procesul care a deschis fișierul.
PID: Numărul de identificare al procesului care a deschis fișierul.
TID: Sarcină (fir) Număr de identificare. O coloană goală înseamnă că nu este o sarcină; este un proces.
Utilizator: ID-ul utilizatorului sau numele utilizatorului căruia îi aparține procesul, sau ID-ul utilizatorului sau autentificarea persoanei care deține directorul în /proc unde lsof găsește informații despre proces.
FD: Afișează descriptorul fișierului. Descriptorii fișierelor sunt descriși mai jos.
Tip: tip de nod asociat fișierului. Tipurile de note sunt descrise mai jos.
Dispozitiv: Conține fie numerele de dispozitiv, separate prin virgule, pentru un caracter special, bloc special, obișnuit, director sau fișier NFS, fie o adresă de referință a nucleului care identifică fișierul. De asemenea, poate afișa adresa de bază sau numele dispozitivului unui dispozitiv socket Linux AX.25.
Dimensiune/Dezactivat: Afișează dimensiunea fișierului sau decalajul fișierului în octeți.
Nod: Afișează numărul de nod al unui fișier local sau numărul inodul unui fișier NFS din gazda serverului sau tipul de protocol de internet. S-ar putea să afișeze STR pentru un flux sau IRQ-ul sau numărul de inod al unui dispozitiv socket Linux AX.25.
Nume: Afișează numele punctului de montare și al sistemului de fișiere pe care se află fișierul.

Coloana FD

Descriptorul de fișier din coloana FD poate fi una dintre multele opțiuni; pagina de manual enumera-le pe toate.

Intrarea în coloana FD poate fi alcătuită din trei părți: un descriptor de fișier, un caracter de mod și un caracter de blocare. Unii descriptori de fișier obișnuiți sunt:

cwd: Director de lucru curent.
err: eroare de informare FD (vezi coloana NUME).
ltx: Textul bibliotecii partajate (cod și date).
m86: Fișier mapat DOS Merge.
mem: Fișier mapat cu memorie.
mmap: Dispozitiv mapat cu memorie.
pd: Directorul părinte.
rtd: director rădăcină.
txt: textul programului (cod și date)
Un număr, reprezentând un descriptor de fișier.

Caracterul modului poate fi unul dintre următoarele:

r: Acces de citire.
w: Acces de scriere.
u: Acces de citire și scriere.
‘ ‘: Un caracter de spațiu, dacă modul este necunoscut și nu există niciun caracter de blocare.
–: Mod necunoscut și există un caracter de blocare.

Caracterul de blocare poate fi unul dintre:

r: Citire blocare pe o parte a fișierului.
R: Citire blocare pe întregul fișier.
w: Blocare de scriere pe o parte a fișierului.
W: Blocarea scrierii pe întregul fișier.
u: Citiți și scrieți blocare de orice lungime.
U: Tip de blocare necunoscut.
‘ ‘: un caracter de spațiu. Fără lacăt.

Coloana TIP

Sunt peste 70 de intrări care ar putea apărea în coloana TIP. Câteva intrări comune pe care le veți vedea sunt:

REG: Fișier sistem de fișiere obișnuit.
DIR: Director.
FIFO: First In First Out.
CHR: Fișier special pentru personaje.
BLK: Blocați fișierul special.
INET: priză de internet.
unix: socket de domeniu UNIX

Consultați Procesele care au deschis un fișier

Pentru a vedea procesele care au deschis un anumit fișier, furnizați numele fișierului ca parametru pentru lsof. De exemplu, pentru a vedea procesele care au deschis fișierul kern.log, utilizați această comandă:

sudo lsof /var/log/kern.log

lsof răspunde prin afișarea unui singur proces, rsyslogd, care a fost pornit de utilizatorul syslog.

Vedeți toate fișierele deschise dintr-un director

Pentru a vedea fișierele care au fost deschise dintr-un director și procesele care le-au deschis, treceți directorul la lsof ca parametru. Trebuie să utilizați opțiunea +D (director).

Pentru a vedea toate fișierele care sunt deschise în directorul /var/log/, utilizați această comandă:

sudo lsof +D /var/log/

lsof răspunde cu o listă cu toate fișierele deschise din acel director.

Pentru a vedea toate fișierele care au fost deschise din directorul /home, utilizați următoarea comandă:

sudo lsof +D /home

Fișierele care au fost deschise din directorul /home sunt afișate. Rețineți că, cu descrieri mai scurte în unele dintre coloane, întreaga listă este mai restrânsă.

Listează fișierele deschise de un proces

Pentru a vedea fișierele care au fost deschise de un anumit proces, utilizați opțiunea -c (comandă). Rețineți că puteți furniza mai mult de un termen de căutare la lsof simultan.

sudo lsof -c ssh -c init

lsof oferă o listă a fișierelor care au fost deschise de oricare dintre procesele furnizate pe linia de comandă.

Consultați fișierele deschise de un utilizator

Pentru a limita afișarea la fișierele care au fost deschise de un anumit utilizator, utilizați opțiunea -u (utilizator). În acest exemplu, ne vom uita la fișierele care au fost deschise de procesele care sunt deținute sau lansate în numele lui Mary.

sudo lsof -u mary

Toate fișierele enumerate au fost deschise în numele utilizatorului Mary. Acestea includ fișierele care au fost deschise de mediul desktop, de exemplu, sau pur și simplu ca urmare a logării lui Mary.

Excluzând fișierele deschise de un utilizator

Pentru a exclude fișierele care au fost deschise de un utilizator, utilizați operatorul ^. Excluderea utilizatorilor din listă facilitează găsirea informațiilor care vă interesează. Trebuie să utilizați opțiunea -u ca înainte și să adăugați caracterul ^ la începutul numelui utilizatorului.

sudo lsof +D /home -u ^mary

De data aceasta, lista pentru directorul /home nu include niciunul dintre fișierele care au fost deschise de utilizatorul Mary.

Listează fișierele deschise de un proces

Pentru a lista fișierele care au fost deschise de un anumit proces, utilizați opțiunea -p (proces) și furnizați ID-ul procesului ca parametru.

sudo lsof - p 4610

Toate fișierele care au fost deschise de ID-ul de proces pe care îl furnizați sunt listate pentru dvs.

Listarea ID-urilor de proces care au deschis un fișier

Pentru a vedea ID-urile proceselor pentru procesele care au deschis un anumit fișier, utilizați opțiunea -t (concis) și furnizați numele fișierului pe linia de comandă.

sudo lsof -t /usr/share/mime/mime.cache

ID-urile procesului sunt afișate într-o listă simplă.

Utilizați căutări AND și SAU

Să enumerăm fișierele care au fost deschise de utilizatorul Mary, care sunt legate de procesele SSH. Știm că putem oferi mai mult de un element de căutare pe linia de comandă, așa că acest lucru ar trebui să fie ușor.

sudo lsof -u mary -c ssh

Acum să ne uităm la ieșirea de la lsof. Asta nu pare corect; există intrări în ieșire care au fost pornite de root.

La asta nu ne așteptam. Ce s-a întâmplat?

Când furnizați mai mulți termeni de căutare, lsof va returna orice fișier care se potrivește cu primul termen de căutare sau cu al doilea termen de căutare și așa mai departe. Cu alte cuvinte, efectuează o căutare SAU.

Pentru a face ca lsof să efectueze o căutare AND, utilizați opțiunea -a (și). Aceasta înseamnă că singurele fișiere care vor fi listate vor fi cele care se potrivesc cu primul termen de căutare, cu al doilea termen de căutare și așa mai departe.

Să încercăm din nou și să folosim opțiunea -a.

sudo lsof -u mary -c ssh -a

Acum fiecare fișier din listă este unul care a fost deschis de sau în numele lui Mary și este asociat cu comanda SSH.

Reîmprospătarea automată a afișajului

Putem folosi opțiunea +|-r (repetare) pentru a pune lsof în modul repetare. Opțiunea de repetare poate fi aplicată în două moduri, fie +r, fie -r. De asemenea, trebuie să adăugăm numărul de secunde pe care dorim să le aștepte înainte de a reîmprospăta afișajul.

Utilizarea opțiunii de repetare în oricare format face ca lsof să afișeze rezultatele ca de obicei, dar adaugă o linie întreruptă în partea de jos a afișajului. Așteaptă numărul de secunde furnizat pe linia de comandă și apoi reîmprospătează afișajul cu un nou set de rezultate.

Cu opțiunea -r, aceasta va continua până când apăsați Ctrl+C. Cu formatul +r, va continua până când nu există rezultate de afișat sau până când apăsați Ctrl+C.

sudo lsof -u mary -c ssh -a -r5

Observați linia întreruptă din partea de jos a listei. Aceasta separă fiecare nouă afișare de date atunci când rezultatul este reîmprospătat.

Afișarea fișierelor asociate conexiunilor la Internet

Opțiunea -i (internet) vă permite să vedeți fișierele deschise de procesele asociate cu conexiunile la rețea și la internet.

lsof -i

Sunt afișate toate fișierele deschise de conexiunile la rețea și la internet.

Afișarea fișierelor asociate conexiunilor la Internet prin ID-ul procesului

Pentru a vedea fișierele deschise de conexiunile la internet care sunt asociate cu un anumit ID de proces, adăugați opțiunea -p și opțiunea -a.

Aici căutăm fișiere deschise printr-o conexiune la internet sau la rețea, printr-un proces cu un ID de 606.

sudo lsof -i -a -p 606

Sunt afișate toate fișierele deschise prin ID-ul procesului 606 care sunt asociate cu conexiunile la internet sau la rețea.

Afișarea fișierelor asociate conexiunilor și comenzilor la Internet

Putem folosi opțiunea -c (comandă) pentru a căuta fișiere deschise de anumite procese. Pentru a căuta fișiere care au fost deschise de conexiuni la internet sau la rețea asociate cu procesul ssh, utilizați următoarea comandă:

lsof -i -a -c ssh

Toate fișierele deschise din cauza proceselor ssh sunt listate în rezultat.

Afișarea fișierelor asociate cu conexiunile și porturile la internet

Putem face un raport lsof asupra fișierelor care au fost deschise prin conexiuni la internet sau la rețea pe un anumit port. Pentru a face acest lucru, folosim caracterul : urmat de numărul portului.

Aici îi cerem lui lsof să listeze fișierele care au fost deschise de conexiunile de rețea sau de internet folosind portul 22.

lsof -i :22

Toate fișierele enumerate au fost deschise de procesele asociate cu portul 22 (care este portul implicit pentru conexiunile SSH).

Afișarea fișierelor asociate conexiunilor și protocoalelor la Internet

Putem cere lsof să arate fișierele care au fost deschise prin procese asociate cu conexiunile la rețea și la internet, care utilizează un protocol specific. Putem alege dintre TCP, UDP și SMTP. Să folosim protocolul TCP și să vedem ce obținem.

sudo lsof -i tcp

Singurele fișiere listate sunt cele deschise de procese care utilizează protocolul TCP.

Am zgâriat doar suprafața

Aceasta este o bază bună în unele cazuri de utilizare obișnuite pentru lsof, dar există mult mai mult decât atât. Cât mai mult poate fi judecat după faptul că pagina de manual are peste 2.800 de linii.

Comanda lsof poate fi folosită pentru a explora din ce în ce mai adânc în straturile de fișiere deschise și pseudo-fișiere. Am furnizat o hartă schiță; atlasul este în pagina de manual.