Hur man använder Linux lsof-kommandot

Om allt i Linux är en fil måste det finnas mer i det än bara filer på din hårddisk. Denna handledning visar dig hur du använder lsof för att se alla andra enheter och processer som hanteras som filer.

På Linux är allt en fil

Den ofta citerade frasen att allt i Linux är en fil är typ sant. En fil är en samling bytes. När de läses in i ett program eller skickas till en skrivare verkar de generera en ström av byte. När de skrivs till accepterar de en ström av byte.

Många andra systemkomponenter accepterar eller genererar strömmar av byte, såsom tangentbord, uttagsanslutningar, skrivare och kommunikationsprocesser. Eftersom de antingen accepterar, genererar eller accepterar och genererar byteströmmar, kan dessa enheter hanteras – på en mycket låg nivå – som om de vore filer.

Detta designkoncept förenklade implementeringen av Unix-operativsystemet. Det innebar att en liten uppsättning hanterare, verktyg och API:er kunde skapas för att hantera en lång rad olika resurser.

Data- och programfilerna som finns på din hårddisk är vanliga gamla filsystemfiler. Vi kan använda kommandot ls för att lista dem och ta reda på några detaljer om dem.

Hur får vi reda på alla andra processer och enheter som behandlas som om de vore filer? Vi använder kommandot lsof. Detta listar de öppna filerna i systemet. Det vill säga, den listar allt som hanteras som om det vore en fil.

lsof-kommandot

Många av processerna eller enheterna som lsof kan rapportera om tillhör root eller har startats av root, så du kommer att behöva använda kommandot sudo med lsof.

Och eftersom den här listan kommer att bli väldigt lång kommer vi att gå igenom den mindre .

sudo lsof | less

Innan lsof-utgången visas kan GNOME-användare se ett varningsmeddelande i terminalfönstret.

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

lsof försöker bearbeta alla monterade filsystem. Detta varningsmeddelande visas eftersom lsof har stött på en GNOME virtuellt filsystem (GVFS). Detta är ett specialfall av en filsystem i användarutrymmet (SÄKRING). Den fungerar som en brygga mellan GNOME, dess API:er och kärnan. Ingen – inte ens root – kan komma åt ett av dessa filsystem, förutom ägaren som monterade det (i det här fallet GNOME). Du kan ignorera denna varning.

Utgången från lsof är mycket bred. Kolumnerna längst till vänster är:

Kolumnerna längst till höger är:

Kolumnernas lsof

Alla kolumner gäller inte för alla typer av öppna filer. Det är normalt att vissa av dem är tomma.

Kommando: Namnet på kommandot som är kopplat till processen som öppnade filen.
PID: Processidentifikationsnummer för processen som öppnade filen.
TID: Uppgift (tråd) Identifikationsnummer. En tom kolumn betyder att det inte är en uppgift; det är en process.
Användare: Användar-ID eller namn på användaren som processen tillhör, eller användar-ID eller inloggning för personen som äger katalogen i /proc där lsof hittar information om processen.
FD: Visar filbeskrivningen för filen. Filbeskrivningar beskrivs nedan.
Typ: typ av nod som är associerad med filen. Anteckningstyper beskrivs nedan.
Enhet: Innehåller antingen enhetsnumren, separerade med kommatecken, för en specialtecken, blockspecial, vanlig, katalog eller NFS-fil, eller en kärnreferensadress som identifierar filen. Den kan också visa basadressen eller enhetsnamnet för en Linux AX.25-uttagsenhet.
Storlek/Av: Visar storleken på filen eller filförskjutningen i byte.
Nod: Visar nodnumret för en lokal fil, eller inodnumret för en NFS-fil i servervärden, eller internetprotokolltyp. Den kan visa STR för en ström eller IRQ- eller inodnumret för en Linux AX.25-uttagsenhet.
Namn: Visar namnet på monteringspunkten och filsystemet där filen finns.

FD-kolumnen

Filbeskrivningen i FD-kolumnen kan vara ett av många alternativ; man-sidan lista dem alla.

FD-kolumnposten kan bestå av tre delar: en filbeskrivning, ett lägestecken och ett låstecken. Några vanliga filbeskrivningar är:

cwd: Aktuell arbetskatalog.
fel: FD-informationsfel (se kolumnen NAMN).
ltx: Delad bibliotekstext (kod och data).
m86: DOS Merge mappad fil.
mem: Minnesmappad fil.
mmap: Minnesmappad enhet.
pd: Föräldrakatalog.
rtd: Rotkatalog.
txt: Programtext (kod och data)
Ett nummer som representerar en filbeskrivning.

Lägetecknet kan vara något av följande:

r: Läsåtkomst.
w: Skrivåtkomst.
u: Läs- och skrivåtkomst.
’ ’: Ett mellanslagstecken, om läget är okänt och det inte finns något låstecken.
–: Läge okänt och det finns ett låstecken.

Låstecknet kan vara något av:

r: Läs lås på en del av filen.
R: Läs lås på hela filen.
w: Skrivlås på en del av filen.
W: Skrivlås på hela filen.
u: Läs- och skrivlås av valfri längd.
U: Okänd låstyp.
’ ’: Ett blanksteg. Inget lås.

Kolumnen TYPE

Det finns över 70 bidrag som kan visas i kolumnen TYP. Några vanliga poster du kommer att se är:

REG: Vanlig filsystemfil.
DIR: Katalog.
FIFO: Först in först ut.
CHR: Specialfil för karaktärer.
BLK: Blockera specialfil.
INET: Internetuttag.
unix: UNIX-domänsocket

Se Processer som har öppnat en fil

För att se processerna som har öppnat en viss fil, ange namnet på filen som en parameter till lsof. För att till exempel se processerna som har öppnat filen kern.log, använd det här kommandot:

sudo lsof /var/log/kern.log

lsof svarar genom att visa den enda processen, rsyslogd som startades av användarens syslog.

Se alla filer som öppnats från en katalog

För att se filerna som har öppnats från en katalog, och processerna som öppnade dem, skicka katalogen till lsof som en parameter. Du måste använda alternativet +D (katalog).

För att se alla filer som är öppna i /var/log/-katalogen, använd det här kommandot:

sudo lsof +D /var/log/

lsof svarar med en lista över alla öppna filer i den katalogen.

För att se alla filer som har öppnats från /home-katalogen, använd följande kommando:

sudo lsof +D /home

Filerna som har öppnats från /home-katalogen visas. Observera att med kortare beskrivningar i några av kolumnerna är hela listningen smalare.

Lista filer som öppnats av en process

För att se filerna som har öppnats av en viss process, använd alternativet -c (kommando). Observera att du kan tillhandahålla mer än en sökterm till lsof samtidigt.

sudo lsof -c ssh -c init

lsof tillhandahåller en lista över filerna som har öppnats av någon av processerna på kommandoraden.

Se Filer som öppnats av en användare

För att begränsa visningen till de filer som har öppnats av en specifik användare, använd alternativet -u (användare). I det här exemplet kommer vi att titta på filerna som har öppnats av processer som ägs eller lanseras på uppdrag av Mary.

sudo lsof -u mary

Alla listade filer har öppnats på uppdrag av användaren Mary. Detta inkluderar filer som har öppnats av exempelvis skrivbordsmiljön, eller helt enkelt som ett resultat av att Mary har loggat in.

Exkluderar filer som öppnats av en användare

För att utesluta filerna som har öppnats av en användare, använd ^-operatorn. Att utesluta användare från listan gör det lättare att hitta den information du är intresserad av. Du måste använda alternativet -u som tidigare och lägga till tecknet ^ i början av användarens namn.

sudo lsof +D /home -u ^mary

Den här gången innehåller listan för /home-katalogen inte några av filerna som har öppnats av användaren Mary.

Lista filer som öppnats av en process

För att lista filerna som har öppnats av en specifik process, använd alternativet -p (process) och ange process-ID som en parameter.

sudo lsof - p 4610

Alla filer som har öppnats av det process-ID du anger listas åt dig.

Lista process-ID:n som har öppnat en fil

För att se process-ID:n för de processer som har öppnat en viss fil, använd alternativet -t (terse) och ange namnet på filen på kommandoraden.

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

Process-ID:n visas i en enkel lista.

Använd OCH- och ELLER-sökningar

Låt oss lista de filer som har öppnats av användaren Mary, som är relaterade till SSH-processerna. Vi vet att vi kan tillhandahålla mer än ett sökobjekt på kommandoraden, så detta borde vara enkelt.

sudo lsof -u mary -c ssh

Låt oss nu titta på utdata från lsof. Det ser inte rätt ut; det finns poster i utgången som startades med root.

Det var inte vad vi förväntade oss. Vad hände?

När du anger flera söktermer kommer lsof att returnera alla filer som matchar den första söktermen eller den andra söktermen, och så vidare. Med andra ord, den utför en ELLER-sökning.

För att få lsof att utföra en OCH-sökning, använd alternativet -a (och). Det betyder att de enda filerna som kommer att listas kommer att vara de som matchar den första söktermen och den andra söktermen och så vidare.

Låt oss försöka igen och använda alternativet -a.

sudo lsof -u mary -c ssh -a

Nu är varje fil i listan en som har öppnats av eller på uppdrag av Mary och är associerad med SSH-kommandot.

Uppdaterar skärmen automatiskt

Vi kan använda alternativet +|-r (upprepa) för att sätta lsof i upprepningsläge. Upprepningsalternativet kan tillämpas på två sätt, antingen +r eller -r. Vi måste också lägga till antalet sekunder som vi vill att lsof ska vänta innan vi uppdaterar displayen.

Genom att använda upprepningsalternativet i båda formaten visar lsof resultaten som vanligt, men det lägger till en streckad linje längst ner på skärmen. Den väntar på det antal sekunder som anges på kommandoraden och uppdaterar sedan skärmen med en ny uppsättning resultat.

Med alternativet -r fortsätter detta tills du trycker på Ctrl+C. Med +r-formatet fortsätter det tills det inte finns några resultat att visa, eller tills du trycker på Ctrl+C.

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

Notera den streckade linjen längst ned i listan. Detta separerar varje ny visning av data när utgången uppdateras.

Visar filer associerade med internetanslutningar

Alternativet -i (internet) låter dig se filerna som öppnas av processer associerade med nätverks- och internetanslutningar.

lsof -i

Alla filer som öppnas av nätverks- och internetanslutningar visas.

Visar filer associerade med internetanslutningar efter process-ID

För att se filerna som öppnas av internetanslutningar som är associerade med ett specifikt process-ID, lägg till -p-alternativet och -a-alternativet.

Här letar vi efter filer som öppnas av en internet- eller nätverksanslutning, genom en process med ID 606.

sudo lsof -i -a -p 606

Alla filer som öppnas av process-ID 606 som är associerade med internet- eller nätverksanslutningar visas.

Visar filer associerade med Internetanslutningar och kommandon

Vi kan använda alternativet -c (kommando) för att leta efter filer som öppnats av specifika processer. För att leta efter filer som har öppnats av internet eller nätverksanslutningar associerade med ssh-processen, använd följande kommando:

lsof -i -a -c ssh

Alla filer som öppnats på grund av ssh-processerna listas i utdata.

Visar filer associerade med internetanslutningar och portar

Vi kan göra lsof-rapporter om filerna som öppnades av internet eller nätverksanslutningar på en specifik port. För att göra detta använder vi tecknet : följt av portnumret.

Här ber vi lsof att lista de filer som har öppnats av nätverk eller internetanslutningar med port 22.

lsof -i :22

Alla de listade filerna öppnades av processer associerade med port 22 (som är standardporten för SSH-anslutningar).

Visar filer associerade med Internetanslutningar och protokoll

Vi kan be lsof att visa de filer som har öppnats av processer associerade med nätverks- och internetanslutningar, som använder ett specifikt protokoll. Vi kan välja mellan TCP, UDP och SMTP. Låt oss använda TCP-protokollet och se vad vi får.

sudo lsof -i tcp

De enda filer som anges är de som öppnas av processer som använder TCP-protokollet.

Vi har bara skrapat på ytan

Det är en bra grund i vissa vanliga användningsfall för lsof, men det finns mycket mer i det än så. Hur mycket mer kan bedömas av det faktum att mansidan är över 2 800 rader lång.

Kommandot lsof kan användas för att borra allt djupare i skikten av öppna filer och pseudofiler. Vi har tillhandahållit en skisskarta; atlasen är inne man-sidan.