Sådan viser du åbne filer til en proces på Linux

Vejledning til brug af 'lsof'-kommandoen til en proces

Hvis du er en hyppig bruger af Linux- eller Unix-systemer, skal du helt sikkert have hørt sætningen "I Linux er alt en fil". Dette kan kategoriseres som oversimplificeringen af ​​konceptet, men det viser sig at være meget nyttigt at forstå, hvordan filer i Linux-systemet fungerer.

Ikke alt, der vises i Linux-miljøet, behøver at være en fil. Nogle gange kan det være en proces, det kan være en speciel fil, der repræsenterer hardwareinformation, mapper og andre ting.

Denne tutorial vil lede dig igennem for at finde alle de filer, der er åbne for en bestemt proces i Linux.

Introduktion til lsof Kommando

Det smukke ved Linux-systemet er, at du kan styre og administrere hele dit system gennem terminalen, forudsat at du kender kommandoerne godt. Når kommandoerne er kendt, bliver alle opgaver på terminalen en kagegang.

lsof står for 'Liste over åbne filer’. Når du kender den lange version af kommandoen, bliver det meget nemt for dig at forstå og bruge kommandoen på en produktiv måde.

Det lsof kommandoen viser lister over åbne filer, sockets og rør. Du kan nemt søge efter de åbne filer ved hjælp af denne kommando. Når lsof kommandoen bruges uden nogen valgmulighed, den viser alle de åbne filer med hensyn til de aktive processer, der kører.

Bemærk: Sørg for at bruge sudo mens du udfører kommandoerne.

Bruger lsof Kommando

Vi vil studere outputtet af lsof kommando i detaljer. Studer følgende kommando.

sudo lsof | mindre

Bemærk: Hvis vi direkte kører lsof kommandoen, vil outputtet være meget stort og kan skabe forvirring for at komme videre. Derfor har jeg her brugt lsof | mindre kommando for at gøre selvstudiet nemmere.

Produktion:

gaurav@ubuntu:~$ sudo lsof | mindre COMMAND PID TID BRUGER FD TYPE ENHEDSSTØRRELSE/FRA NODE NAVN kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs unknown /procns31 root 31 root 31 DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt ukendt /proc/32/exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks DIR 06rtd 33 root 8rtd / rcu_tasks 33 root txt ukendt /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 ukendt /proc/34/exe 

Følgende er de attributter, der vises ved hjælp af lsof kommando.

ParameterBeskrivelse
KommandoViser navnet på den kommando, der åbner filen.
PIDProcesidentifikationsnummer for den proces, der åbner filen.
TIDTrådidentifikationsnummer. Det kan enten være en tråd eller et opgavenummer.
BrugerBruger-id eller navn på den bruger, der er ejer af processen.
FDViser filbeskrivelsen for filen.
TypeType knude, der er knyttet til filen.
EnhedViser enhedsnumre.
Størrelse/FraViser størrelsen af ​​filen i bytes.
NodeViser inodenummeret i biblioteket eller det overordnede bibliotek.
NavnViser navnet på det filsystem, hvor processen er placeret.

Liste over processerne

Først og fremmest er det vigtigt for dig at få de processer, der kører, og deres respektive proces-id'er. Linux giver forskellige kommandoer til at liste processerne sammen med deres attributter som PID, bruger, bibliotek osv.

Du kan bruge kommandoerne som f.eks top, ps, htop, pstree for at liste processerne på terminalen.

Gennem hele øvelsen vil jeg bruge top kommando til at gøre det. Det top kommando giver en dynamisk realtidsvisning af et kørende system. Den viser også alle de processer og tråde, der i øjeblikket administreres af Linux-kernen. Studer den nedenfor angivne blok for at kontrollere outputtet af top kommando.

Syntaks:

sudo top

Produktion:

gaurav@ubuntu:~$sudo top PID BRUGER 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 3mon S 2 0 6 2 0 7 34.41 mongod 13765 gaurav 20 0 2.931.568 131.408 47496 S 5.9 3.3 1: 42.34 Web Content 1 rod 20 0 225.904 6824 4900 S 0,0 0,2 0: 27.25 systemd 2 rod 20 0 0 0 0 S 0,0 0,0 0: 00.05 KThreadd 4 rod 0 -20 0 0 0 I 0,0 0,0 0:00,00 kworker/0:0H 6 rod 0 -20 0 0 0 I 0,0 0,0 0:00,00 mm_percpu_wq 7 rod 20 0 0 0 0 S 0,0 0,0 0 0 0,0 0,0 9:0 rod 0,0 9:0 soft 0. 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 

I ovenstående blok kan vi se alle procesrelaterede oplysninger på ét sted. Herfra kan vi finde PID af processen, som vi skal vise de åbne filer ved hjælp af lsof kommando.

Men hvis du kun vil finde ud af proces-id'et for en bestemt proces og undgå andre uønskede processer, så brug følgende kommando.

Syntaks:

sudo top | grep [Process_Name]

Eksempel:

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

Her har vi specifikt vist proces-id'et for processen, som har strengen 'terminal' i procesnavnet. Denne metode er praktisk, når du ikke er klar over det komplette procesnavn eller PID.

Viser de åbne filer relateret til en proces, der bruger PID

I ovenstående blok lærte vi, hvordan man opnår procesrelaterede oplysninger ved hjælp af den øverste kommando. Nu vil vi bruge PID svarende til en hvilken som helst proces på systemet, og prøv at få vist listen over de åbne filer, der er relateret til denne proces ved hjælp af lsof kommando.

Fra ovenstående output, lad os tage processen svarende til PID 1173, som er fremhævet. Vi vil bruge lsof -p [PID] kommando til at gøre det.

Syntaks:

sudo lsof -p [PID]

Denne kommando tager processens PID som input og viser alle de filer, der svarer til denne PID.

Produktion:

gaurav@ubuntu:~$ sudo lsof -p 1173 lsof: ADVARSEL: kan ikke stat() fuse.gvfsd-fuse filsystem /run/user/1000/gvfs Outputoplysninger kan være ufuldstændige. COMMAND PID BRUGER FD TYPE ENHEDSSTØRRELSE/FRA KNODENAVN mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb 8,849 8 mongodb 8 txt mongodb 8,8696 REG 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/linsolux-2g 3 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-gnu/4_linux_gnu.godb 3 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/godale-archive 1720mon 1720mon 1720mon 1720mon 1720 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 mongod 1173 REG 8,48b 6,48b 6,48b 6,48b x86_64-linux-gnu/libgcc_s.so.1 mongod 1173 mongodb mig 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-gnu/libdl. 7 memgod-gnu/libdl. 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-gnu. :~$

Filerne, der er åbne for processen med proces-ID 1713, vises ved hjælp af lsof kommando.

Bemærk: GNOME-brugere kan støde på nedenstående advarsel. Du kan roligt ignorere det.

lsof: ADVARSEL: kan ikke stat() fuse.gvfsd-fuse filsystem /run/user/1000/gvfs Outputoplysninger kan være ufuldstændige.

Liste over åbne filer relateret til en proces, der bruger procesnavnet

Det lsof kommandoen giver dig også en mulighed for at liste de åbne filer ved hjælp af navnene på processerne. Navnene skal angives til kommandoen som en inputstreng. Se syntaksen nedenfor for at bruge denne mulighed.

Syntaks:

sudo lsof -c [Procesnavn]

Eksempel:

sudo lsof -c mysql

Produktion:

gaurav@ubuntu:~$ sudo lsof -c mysql lsof: ADVARSEL: kan ikke stat() fuse.gvfsd-fuse filsystem /run/user/1000/gvfs Outputoplysninger kan være ufuldstændige. COMMAND PID BRUGER FD TYPE ENHEDSSTØRRELSE/FRA NODE NAVN mysqld 1266 mysql cwd DIR 8,8 4096 3154135 /var/lib/mysql mysqld 1266 mysql rtd DIR 8,8 2096 4096 4096 4096 4096 4096 4096 4096 4096 4096 9 /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] mysql 26q /[aio] mysql 26q /[aio 1 26q / 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. 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 

Outputtet vil være som det, hvori proces-id'et bruges i stedet for procesnavnet.

Listefiler åbnet af netværksforbindelser

I Linux kan filer også være i form af information om dine netværksforbindelser, hardwareforbindelser etc. Vi kan bruge lsof kommando for at vise de filer, der åbnes af netværksforbindelsen. Brug følgende metode.

sudo lsof -i

Produktion:

gaurav@ubuntu:~$ sudo lsof -i COMMAND PID BRUGER FD TYPE ENHEDSSTØRRELSE/FRA NODENAVN systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost:domæne systemd-r 969 systemd-resolve 4:07Tu localhost 4:07 T domæne (LYT) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu:48090->_gateway:domæne avahi-dae 1028 avahi 12u IPv4 23810 0t0 avaDP 2-8md 0 DP 2 *: 0 0 DP 2 0 md 2 *: 0 0 DP 1 avahi-dae 1028 avahi 14u IPv4 23.812 0t0 UDP *: 58.999 avahi-dae 1028 avahi 15u IPv6 23813 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 (LYT) apache2 1283 root 4u IPv6 28140 0t0 TCP *:http (LYT) gaurav@ubuntu:~$

Her kan vi se oplysningerne om de filer, der er åbne af netværksforbindelsen ved hjælp af lsof -i kommando.

Konklusion

I denne enkle vejledning har vi lært, hvordan man viser åbne filer til en proces i Linux ved hjælp af forskellige metoder, der er nemme at bruge. For flere anvendelser af lsof kommando, se lsof man-side.