Cum să enumerați fișierele deschise pentru un proces pe Linux

Ghid pentru utilizarea comenzii „lsof” pentru un proces

Dacă sunteți un utilizator frecvent al sistemelor Linux sau Unix, trebuie să fi auzit cu siguranță expresia „În Linux, totul este un fișier”. Aceasta poate fi clasificată drept o simplificare excesivă a conceptului, dar se dovedește a fi foarte util să înțelegem cum funcționează fișierele din sistemul Linux.

Nu tot ce apare în mediul Linux trebuie să fie un fișier. Uneori poate fi un proces, poate fi un fișier special care reprezintă informații despre hardware, directoare și alte lucruri.

Acest tutorial vă va ghida în găsirea tuturor fișierelor care sunt deschise pentru un anumit proces în Linux.

Introducere in lsof Comanda

Frumusețea sistemului Linux este că vă puteți controla și gestiona întregul sistem prin intermediul terminalului, cu condiția să cunoașteți bine comenzile. Odată ce comenzile sunt cunoscute, atunci toate sarcinile de pe terminal devin un cakewalk.

lsof reprezintă „Lista fișierelor deschise‘. Odată ce cunoașteți versiunea lungă a comenzii, devine foarte ușor să înțelegeți și să utilizați comanda într-un mod productiv.

The lsof comanda afișează listele de fișiere deschise, socket-uri și conducte. Puteți căuta cu ușurință fișierele deschise folosind această comandă. Cand lsof comanda este folosită fără nicio opțiune, afișează toate fișierele deschise cu privire la procesele active care rulează.

Notă: Asigurați-vă că utilizați sudo în timpul executării comenzilor.

Folosind The lsof Comanda

Vom studia rezultatul lsof comanda în detaliu. Studiați următoarea comandă.

sudo lsof | Mai puțin

Notă: Dacă rulăm direct lsof comandă, rezultatul va fi foarte mare și ar putea crea confuzie pentru a continua. Prin urmare, aici am folosit lsof | Mai puțin comandă pentru confortul tutorialului.

Ieșire:

gaurav@ubuntu:~$ sudo lsof | mai puțin COMANDĂ PID TID UTILIZATOR TIP FD DISPOZITIV DIMENSIUNE/OFF NUME NOD kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root cwd necunoscut / root txns32 DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt necunoscut /proc/32/exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 339, 8 2 root DIR 339 / rcu_tasks 33 root txt necunoscut /proc/33/exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kauditd 34 root txt necunoscut /proc/34/exe 

Următoarele sunt atributele care sunt afișate folosind lsof comanda.

ParametruDescriere
ComandaAfișează numele comenzii care deschide fișierul.
PIDNumărul de identificare al procesului care deschide fișierul.
TIDNumărul de identificare a firului. Poate fi fie un fir de discuție, fie un număr de sarcină.
UtilizatorID-ul utilizatorului sau numele utilizatorului care este proprietarul procesului.
FDAfișează descriptorul fișierului.
TipTipul de nod asociat fișierului.
DispozitivAfișează numerele dispozitivului.
Dimensiune/OpritAfișează dimensiunea fișierului în octeți.
NodulAfișează numărul inodului directorului sau directorului părinte.
NumeAfișează numele sistemului de fișiere în care se află procesul.

Listarea proceselor

În primul rând, este important pentru dvs. să obțineți procesele care rulează și ID-urile procesului respectiv. Linux oferă o varietate de comenzi pentru a enumera procesele împreună cu atributele lor, cum ar fi PID, utilizator, director etc.

Puteți folosi comenzi precum top, ps, htop, pstree pentru a enumera procesele de pe terminal.

Pe tot parcursul tutorialului, voi folosi top comanda să facă asta. The top comanda oferă o vizualizare dinamică în timp real a unui sistem care rulează. De asemenea, afișează toate procesele și firele de execuție gestionate în prezent de nucleul Linux. Studiați blocul de mai jos pentru a verifica rezultatul top comanda.

Sintaxă:

sudo top

Ieșire:

gaurav@ubuntu:~$sudo top PID UTILIZATOR PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2703 gaurav 20 0 4286124 1.142g 103584 R 88.2 30.5 87:48.08 Web Content 1 6 8 2 7 3 0 6 6 7 3 34,41 mongod 13765 gaurav 20 0 2931568 131408 47496 S 5.9 3.3 1: 42,34 Conținut Web 1 rădăcină 20 0 225904 6824 4900 S 0.0 0.2 0: 27.25 systemd 2 rădăcină 20 0 0 0 0 S 0,0 0,0 0: 00.05 KThreadd 4 rădăcină 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 softir 0 0 I 0.0 0.0 0:22.32 rcu_sched 9 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0:03.13 migration 

În blocul de mai sus, putem vedea toate informațiile legate de proces într-un singur loc. De aici putem găsi PID a procesului căruia trebuie să afișăm fișierele deschise folosind lsof comanda.

Dar dacă doriți să aflați ID-ul procesului doar unui anumit proces și să evitați alte procese nedorite, atunci utilizați următoarea comandă.

Sintaxă:

sudo top | grep [Nume_proces]

Exemplu:

gaurav@ubuntu:~$ top | grep terminale 13819 gaurav 20 0 803336 19728 9160 S 0,3 0,5 0: 53,63 gnome-13819 gaurav borne 20 0 803336 19728 9160 S 1.0 0.5 0: 53,66 gnome-13819 gaurav borne 20 0 803336 19728 9160 S 0,3 0,5 0: 53,67 gnom -terminal- gaurav@ubuntu:~$

Aici am afișat în mod specific ID-ul procesului care are șirul „terminal” în numele procesului. Această metodă este utilă atunci când nu cunoașteți numele complet al procesului sau PID-ul.

Afișarea fișierelor deschise legate de un proces care utilizează PID

În blocul de mai sus, am învățat cum să obținem informații legate de proces cu ajutorul comenzii de sus. Acum vom folosi PID corespunzând oricărui proces din sistem și încercați să afișați lista fișierelor deschise legate de acel proces folosind lsof comanda.

Din rezultatul de mai sus, să luăm procesul corespunzător PID 1173 care este evidențiat. Vom folosi lsof -p [PID] comanda să facă asta.

Sintaxă:

sudo lsof -p [PID]

Această comandă ia PID-ul procesului ca intrare și listează toate fișierele corespunzătoare acestui PID.

Ieșire:

gaurav@ubuntu:~$ sudo lsof -p 1173 lsof: AVERTISMENT: nu se poate stat() sistemul de fișiere fuse.gvfsd-fuse /run/user/1000/gvfs Informațiile de ieșire pot fi incomplete. COMANDĂ PID UTILIZATOR TIP FD DISPOZITIV DIMENSIUNE/DEZACTIVAT NUME NOD mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb 1173 mongodb / 84/8383828 84096 2 / mongodb 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/x86-2624643 /lib/x86_mongodlibre. mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64-linux_1gnumdns4_mongod3. 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 /usr/lib/locale/locale-archive / memgod 1173 1173 47568 2624441 lib/x86_64-linux-gnu/libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 mongodb mem96 68,8 /lib96 68,8 /lib/lib94 x86_64-linux-gnu/libgcc_s.so.1 mongod 1173 mongodb me m REG 8,8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8,8 14560 2621535 /lib/x86_64-linux-linux-gnu/libm-32gnud2 71. 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-2.27. :~$

Fișierele care sunt deschise pentru proces cu ID de proces 1713 sunt afișate folosind lsof comanda.

Notă: Utilizatorii GNOME pot întâlni avertismentul de mai jos. Îl poți ignora în siguranță.

lsof: AVERTISMENT: nu se poate stat() fuse.gvfsd-fuse sistem de fișiere /run/user/1000/gvfs Informațiile de ieșire pot fi incomplete.

Listarea fișierelor deschise legate de un proces folosind numele procesului

The lsof comanda vă oferă, de asemenea, o opțiune de a lista fișierele deschise folosind numele proceselor. Numele ar trebui să fie furnizate comenzii ca șir de intrare. Consultați sintaxa de mai jos pentru a utiliza această opțiune.

Sintaxă:

sudo lsof -c [Numele procesului]

Exemplu:

sudo lsof -c mysql

Ieșire:

gaurav@ubuntu:~$ sudo lsof -c mysql lsof: AVERTISMENT: nu se poate stat() sistemul de fișiere fuse.gvfsd-fuse /run/user/1000/gvfs Informațiile de ieșire pot fi incomplete. COMANDA PID UTILIZATOR TIP FD DIMENSIUNEA DISPOZITIV/DEZACTIVAT NUME NOD mysqld 1266 mysql cwd DIR 8,8 4096 3154135 /var/lib/mysql mysqld 1266 mysql rtd DIR 8,8 4096 mysqlds 2154135 mysqld 2154135 /sbin/mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 /[aio] DEL6 mysqlds,[18126] aio] mysqld 1266 mysql DEL REG 0,18 28125 /[aio] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so 2.27.so 6 mysqld 6 2.27.so lib/x86_64-linux-gnu/libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so 

Ieșirea va fi cea a celui în care este utilizat ID-ul procesului în loc de numele procesului.

Listarea fișierelor deschise prin conexiuni de rețea

În Linux, fișierele pot fi, de asemenea, sub formă de informații despre conexiunile dvs. de rețea, conexiunile hardware etc. Putem folosi lsof comandă pentru a lista fișierele deschise de conexiunea la rețea. Utilizați următoarea metodă.

sudo lsof -i

Ieșire:

gaurav@ubuntu:~$ sudo lsof -i COMANDĂ PID UTILIZATOR TIP FD DIMENSIUNEA DISPOZITIV/OFF NUME NOD systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost:domain systemd-r 969 systemd-resolve 13u systemd-resolve IPv80173 local: domeniu (ASCULTARE) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu:48090->_gateway:domain avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *:md80902: IPv4 23810 0t0 UDP *:md802 avahi102: Avahi-dae 1028 Avahi 14u IPv4 23812 0t0 UDP *: 58,999 Avahi-dae 1028 Avahi 15U IPv6 23,813 0t0 UDP *: 37,512 mongod 1173 MongoDB 6u IPv4 28149 0t0 TCP localhost: 27017 (Listen) mysqld 1266 MySQL 19U IPv4 25992 0t0 TCP localhost: mysql (ASCULTARE) apache2 1283 root 4u IPv6 28140 0t0 TCP *:http (ASCULTARE) gaurav@ubuntu:~$

Aici putem vedea informațiile despre fișierele care sunt deschise de conexiunea la rețea folosind lsof -i comanda.

Concluzie

În acest tutorial simplu, am învățat cum să enumerăm fișierele deschise pentru un proces în Linux, folosind diferite metode care sunt ușor de utilizat. Pentru mai multe utilizări ale lsof comanda, vezi lsof pagina de manual.