Hur man listar öppna filer för en process på Linux

Guide till att använda kommandot 'lsof' för en process

Om du är en frekvent användare av Linux- eller Unix-system måste du säkert ha hört frasen "I Linux är allt en fil". Detta kan kategoriseras som en alltför förenkling av konceptet men det visar sig vara till stor hjälp för att förstå hur filer i Linux-systemet fungerar.

Allt som visas i Linux-miljön behöver inte vara en fil. Ibland kan det vara en process, det kan vara en speciell fil som representerar hårdvaruinformation, kataloger och andra saker.

Denna handledning går igenom dig för att hitta alla filer som är öppna för en viss process i Linux.

Introduktion till lsof Kommando

Det fina med Linux-systemet är att du kan styra och hantera hela ditt system via terminalen, förutsatt att du kan kommandona väl. När kommandona väl är kända blir alla uppgifter på terminalen en cakewalk.

lsof står för 'Lista över öppna filer’. När du väl känner till den långa versionen av kommandot blir det mycket lätt för dig att förstå och använda kommandot på ett produktivt sätt.

De lsof kommandot visar listorna över öppna filer, sockets och pipes. Du kan enkelt söka efter de öppna filerna med detta kommando. När lsof kommandot används utan något alternativ, det visar alla öppna filer med avseende på de aktiva processer som körs.

Notera: Se till att du använder sudo medan du utför kommandona.

Använda lsof Kommando

Vi kommer att studera resultatet av lsof kommandot i detalj. Studera följande kommando.

sudo lsof | mindre

Notera: Om vi ​​direkt kör lsof kommandot kommer utdata att bli mycket stort och kan skapa förvirring för att gå vidare. Därför har jag använt här lsof | mindre kommando för att underlätta handledningen.

Produktion:

gaurav@ubuntu:~$ sudo lsof | mindre COMMAND PID TID ANVÄNDARE FD-TYP ENHETSSTORLEK/AV NODNAMN kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs unknown /procns31 okänt /procns31 root 31 DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt okänd /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 okänd /proc/33/exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kaauditd 34 root txt okänd /proc/34/exe 

Följande är attributen som visas med hjälp av lsof kommando.

ParameterBeskrivning
KommandoVisar namnet på kommandot som öppnar filen.
PIDProcessidentifieringsnummer för processen som öppnar filen.
TIDTrådidentifieringsnummer. Det kan antingen vara en tråd eller ett uppgiftsnummer.
AnvändareAnvändar-ID eller namn på användaren som är ägare till processen.
FDVisar filbeskrivningen för filen.
TypTyp av nod som är associerad med filen.
EnhetVisar enhetsnummer.
Storlek/AvVisar storleken på filen i byte.
NodVisar inodnumret katalogen eller den överordnade katalogen.
namnVisar namnet på filsystemet där processen finns.

Lista över processerna

Först och främst är det viktigt för dig att få tag på de processer som körs och deras respektive process-ID. Linux tillhandahåller olika kommandon för att lista processerna tillsammans med deras attribut som PID, användare, katalog, etc.

Du kan använda kommandon som topp, ps, htop, pstree för att lista processerna på terminalen.

Under hela handledningen kommer jag att använda topp kommando att göra det. De topp kommandot ger en dynamisk realtidsvy av ett körande system. Den visar också alla processer och trådar som för närvarande hanteras av Linux-kärnan. Studera det nedan angivna blocket för att kontrollera utdata från topp kommando.

Syntax:

sudo topp

Produktion:

gaurav@ubuntu:~$sudo top PID ANVÄNDARE 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 87:48,08 Web Content 3mon 2 34,41 mongod 13765 gaurav 20 0 2.931.568 131.408 47496 S 5,9 3,3 1: 42,34 webbinnehåll en rot 20 0 225.904 6824 4900 S 0,0 0,2 0: 27,25 SYSTEMD 2 rot 20 0 0 0 0 S 0,0 0,0 0: 00.05 KThreadd 4 rot 0 -20 0 0 0 I 0,0 0,0 0:00,00 kworker/0:0H 6 rot 0 -20 0 0 0 I 0,0 0,0 0:00,00 mm_percpu_wq 7 rot 20 0 0 0 0 S 0,0 0,0 0 0 0,0 0,0 9:0 soft rot 0,0 9: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/03,13 migration 

I blocket ovan kan vi se all processrelaterad information på ett ställe. Härifrån kan vi hitta PID av processen som vi måste visa de öppna filerna med hjälp av lsof kommando.

Men om du bara vill ta reda på process-ID för en viss process och undvika andra oönskade processer, använd följande kommando.

Syntax:

sudo topp | grep [Process_Name]

Exempel:

gaurav@ubuntu:~$ topp | grep terminala 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:~$

Här har vi specifikt visat process-ID för processen som har strängen "terminal" i processnamnet. Denna metod är praktisk när du inte är medveten om det fullständiga processnamnet eller PID.

Visar de öppna filerna relaterade till en process som använder PID

I blocket ovan lärde vi oss hur man skaffar processrelaterad information med hjälp av toppkommandot. Nu kommer vi att använda PID som motsvarar vilken process som helst på systemet och försök visa listan över öppna filer relaterade till den processen med hjälp av lsof kommando.

Låt oss ta den process som motsvarar PID 1173 som är markerad från den ovan givna utgången. Vi kommer att använda lsof -p [PID] kommando att göra det.

Syntax:

sudo lsof -p [PID]

Detta kommando tar PID för processen som indata och listar alla filer som motsvarar denna PID.

Produktion:

gaurav@ubuntu:~$ sudo lsof -p 1173 lsof: VARNING: kan inte stat() fuse.gvfsd-fuse filsystem /run/user/1000/gvfs Utdatainformation kan vara ofullständig. COMMAND PID ANVÄNDARE FD TYP ENHET STORLEK/AV NOD NAMN 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,849 8 txt mongodb 8 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_6-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.godb 3 REG 8,8 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-arkiv 1723 mon 1 REG 720 1 REG 723 0 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 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-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.gauun :~$

Filerna som är öppna för processen med process-ID 1713 visas med hjälp av lsof kommando.

Notera: GNOME-användare kan stöta på varningen nedan. Du kan lugnt ignorera det.

lsof: VARNING: kan inte stat() fuse.gvfsd-fuse filsystem /run/user/1000/gvfs Utdatainformation kan vara ofullständig.

Lista öppna filer relaterade till en process som använder processnamnet

De lsof kommandot ger dig också ett alternativ att lista de öppna filerna med namnen på processerna. Namnen ska ges till kommandot som en inmatningssträng. Se syntaxen nedan för att använda det här alternativet.

Syntax:

sudo lsof -c [Processnamn]

Exempel:

sudo lsof -c mysql

Produktion:

gaurav@ubuntu:~$ sudo lsof -c mysql lsof: VARNING: kan inte stat() fuse.gvfsd-fuse filsystem /run/user/1000/gvfs Utdatainformation kan vara ofullständig. KOMMANDO PID ANVÄNDARE FD TYP ENHETSSTORLEK/AV NODNAMN mysqld 1266 mysql cwd DIR 8,8 4096 3154135 /var/lib/mysql mysqld 1266 mysql rtd DIR 8,8 2096 1266 mysql rtd DIR 8,8 /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] 1 26q /[aio] 1 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 

Utdata kommer att vara som för den där process-ID används istället för processnamn.

Lista filer som öppnas av nätverksanslutningar

I Linux kan filer även vara i form av information om dina nätverksanslutningar, hårdvaruanslutningar etc. Vi kan använda lsof kommandot för att lista filerna som öppnats av nätverksanslutningen. Använd följande metod.

sudo lsof -i

Produktion:

gaurav@ubuntu:~$ sudo lsof -i COMMAND PID ANVÄNDARE FD TYP ENHETSSTORLEK/AV NODNAMN systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost:domän systemd-r 969 systemd-resolve 4:07 TRU localhost 4:07 domän (LYSNA) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu:48090->_gateway:domain avahi-dae 1028 avahi 12u IPv4 23810 0t0 avaDP2 - 8mdu ava 0 md 0 1 DP 2 *: 0 DP 2 *: 0 DP 2 *: 0 0 md 0 avahi-dae 1028 avahi 14u IPv4 23.812 0T0 UDP *: 58.999 avahi-dae 1028 avahi 15u IPv6 23813 0T0 UDP *: 37512 mongod 1173 mongodb 6u IPv4 28149 0T0 TCP localhost: 27017 (LISTEN) mysqld 1266 mysql 19u IPv4 25992 0T0 TCP localhost: mysql (LYSNA) apache2 1283 root 4u IPv6 28140 0t0 TCP *:http (LYSNA) gaurav@ubuntu:~$

Här kan vi se informationen om filerna som öppnas av nätverksanslutningen med hjälp av lsof -i kommando.

Slutsats

I denna enkla handledning har vi lärt oss hur man listar öppna filer för en process i Linux med olika metoder som är lätta att använda. För mer användning av lsof kommando, se lsof man page.