Sådan bruger du Linux lsof-kommandoen

Hvis alt i Linux er en fil, skal der være mere i det end blot filer på din harddisk. Denne vejledning viser dig, hvordan du bruger lsof til at se alle de andre enheder og processer, der håndteres som filer.

På Linux er alt en fil

Den ofte citerede sætning om, at alt i Linux er en fil, er en slags sand. En fil er en samling af bytes. Når de bliver læst ind i et program eller sendt til en printer, ser de ud til at generere en strøm af bytes. Når de bliver skrevet til, accepterer de en strøm af bytes.

Mange andre systemkomponenter accepterer eller genererer strømme af bytes, såsom tastaturer, socketforbindelser, printere og kommunikationsprocesser. Fordi de enten accepterer, genererer eller accepterer og genererer bytestrømme, kan disse enheder håndteres – på et meget lavt niveau – som om de var filer.

Dette designkoncept forenklede implementeringen af ​​Unix-operativsystemet. Det betød, at et lille sæt af handlere, værktøjer og API’er kunne oprettes til at håndtere en lang række forskellige ressourcer.

De data og programfiler, der ligger på din harddisk, er almindelige gamle filsystemfiler. Vi kan bruge ls-kommandoen til at liste dem og finde ud af nogle detaljer om dem.

Hvordan finder vi ud af alle de andre processer og enheder, der bliver behandlet, som om de var filer? Vi bruger kommandoen lsof. Dette viser de åbne filer i systemet. Det vil sige, det viser alt, der bliver håndteret, som om det var en fil.

lsof-kommandoen

Mange af de processer eller enheder, som lsof kan rapportere om, tilhører root eller blev startet af root, så du bliver nødt til at bruge sudo-kommandoen med lsof.

Og fordi denne fortegnelse bliver meget lang, kommer vi til at gennemgå den mindre.

sudo lsof | less

Før lsof-outputtet vises, kan GNOME-brugere se en advarselsmeddelelse i terminalvinduet.

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

lsof forsøger at behandle alle monterede filsystemer. Denne advarselsmeddelelse er rejst, fordi lsof er stødt på en GNOME virtuelt filsystem (GVFS). Dette er et særligt tilfælde af en filsystem i brugerrummet (SIKRING). Det fungerer som en bro mellem GNOME, dets API’er og kernen. Ingen – ikke engang root – kan få adgang til et af disse filsystemer, bortset fra ejeren, der monterede det (i dette tilfælde GNOME). Du kan ignorere denne advarsel.

  Sådan bruger du kommandoen seq på Linux

Outputtet fra lsof er meget bredt. Kolonnerne længst til venstre er:

Kolonnerne længst til højre er:

Lsof kolonner

Alle kolonner gælder ikke for alle typer åbne filer. Det er normalt, at nogle af dem er tomme.

Kommando: Navnet på den kommando, der er knyttet til den proces, der åbnede filen.
PID: Process Identifikationsnummer for den proces, der åbnede filen.
TID: Opgave (tråd) Identifikationsnummer. En tom kolonne betyder, at det ikke er en opgave; det er en proces.
Bruger: Bruger-id eller navn på den bruger, som processen tilhører, eller bruger-id eller login på den person, der ejer mappen i /proc, hvor lsof finder information om processen.
FD: Viser filbeskrivelsen for filen. Filbeskrivelser er beskrevet nedenfor.
Type: type knude, der er knyttet til filen. Notetyper er beskrevet nedenfor.
Enhed: Indeholder enten enhedsnumrene, adskilt af kommaer, for en speciel karakter, blokspecial, regulær, mappe eller NFS-fil eller en kernereferenceadresse, der identificerer filen. Det kan også vise basisadressen eller enhedsnavnet på en Linux AX.25 socket enhed.
Størrelse/Fra: Viser størrelsen på filen eller filforskydningen i bytes.
Node: Viser nodenummeret på en lokal fil eller inodenummeret på en NFS-fil i serverværten eller internetprotokoltypen. Det kan vise STR for en stream eller IRQ- eller inodenummeret på en Linux AX.25-socket-enhed.
Navn: Viser navnet på monteringspunktet og filsystemet, som filen ligger på.

FD-søjlen

Filbeskrivelsen i FD-kolonnen kan være en af ​​mange muligheder; man-siden liste dem alle.

FD-kolonneposten kan bestå af tre dele: en filbeskrivelse, et tilstandstegn og et låsetegn. Nogle almindelige filbeskrivelser er:

cwd: Aktuel arbejdsmappe.
fejl: FD-informationsfejl (se kolonnen NAVN).
ltx: Delt bibliotekstekst (kode og data).
m86: DOS Merge-tilknyttet fil.
mem: Hukommelseskortet fil.
mmap: Hukommelseskortet enhed.
pd: Forældrekartotek.
rtd: Rodmappe.
txt: Programtekst (kode og data)
Et tal, der repræsenterer en filbeskrivelse.

Tilstandstegnet kan være en af ​​følgende:

r: Læseadgang.
w: Skriveadgang.
u: Læse- og skriveadgang.
‘ ‘: Et mellemrumstegn, hvis tilstanden er ukendt, og der ikke er noget låsetegn.
–: Tilstand ukendt, og der er et låsetegn.

Låsetegnet kan være en af:

r: Læs lås på en del af filen.
R: Læs lås på hele filen.
w: Skrivelås på en del af filen.
W: Skrivelås på hele filen.
u: Læse- og skrivelås af enhver længde.
U: Ukendt låsetype.
‘ ‘: Et mellemrumstegn. Ingen lås.

TYPE-kolonnen

Der er over 70 poster der muligvis vises i kolonnen TYPE. Nogle almindelige poster, du vil se, er:

REG: Almindelig filsystemfil.
DIR: Directory.
FIFO: Først ind først ud.
CHR: Karakter specialfil.
BLK: Bloker specialfil.
INET: Internet-stik.
unix: UNIX domæne socket

Se Processer, der har åbnet en fil

For at se de processer, der har åbnet en bestemt fil, skal du angive navnet på filen som en parameter til lsof. For at se de processer, der har åbnet kern.log-filen, skal du f.eks. bruge denne kommando:

sudo lsof /var/log/kern.log

lsof svarer ved at vise den enkelte proces, rsyslogd, som blev startet af brugerens syslog.

Se alle filer åbnet fra en mappe

For at se de filer, der er blevet åbnet fra en mappe, og de processer, der åbnede dem, skal du sende mappen til lsof som en parameter. Du skal bruge muligheden +D (mappe).

  6 bedste Linux-distributioner til Raspberry Pi

For at se alle de filer, der er åbne i mappen /var/log/, skal du bruge denne kommando:

sudo lsof +D /var/log/

lsof svarer med en liste over alle åbne filer i den mappe.

For at se alle de filer, der er blevet åbnet fra /home-mappen, skal du bruge følgende kommando:

sudo lsof +D /home

Filerne er blevet åbnet fra /home-mappen vises. Bemærk, at med kortere beskrivelser i nogle af kolonnerne, er hele listen smallere.

Liste over filer åbnet af en proces

For at se de filer, der er blevet åbnet af en bestemt proces, skal du bruge indstillingen -c (kommando). Bemærk, at du kan angive mere end én søgeterm til lsof på én gang.

sudo lsof -c ssh -c init

lsof giver en liste over de filer, der er blevet åbnet af en af ​​processerne på kommandolinjen.

Se Filer åbnet af en bruger

For at begrænse visningen til de filer, der er blevet åbnet af en bestemt bruger, skal du bruge -u (bruger) mulighed. I dette eksempel vil vi se på de filer, der er blevet åbnet af processer, der ejes eller lanceres på vegne af Mary.

sudo lsof -u mary

Alle de angivne filer er blevet åbnet på vegne af brugeren Mary. Dette inkluderer filer, der for eksempel er blevet åbnet af skrivebordsmiljøet, eller blot som følge af, at Mary har logget ind.

Ekskludering af filer åbnet af en bruger

For at udelukke de filer, der er blevet åbnet af en bruger, skal du bruge operatoren ^. At ekskludere brugere fra listen gør det nemmere at finde den information, du er interesseret i. Du skal bruge -u-muligheden som før, og tilføje ^-tegnet til starten af ​​brugerens navn.

sudo lsof +D /home -u ^mary

Denne gang inkluderer listen for /home-mappen ikke nogen af ​​de filer, der er blevet åbnet af brugeren Mary.

Liste over filer åbnet af en proces

For at liste de filer, der er blevet åbnet af en specifik proces, skal du bruge -p (proces)-indstillingen og angive proces-id’et som en parameter.

sudo lsof - p 4610

Alle de filer, der er blevet åbnet af det proces-id, du angiver, er opført for dig.

Liste over proces-id’er, der har åbnet en fil

For at se proces-id’erne for de processer, der har åbnet en bestemt fil, skal du bruge indstillingen -t (terse) og angive navnet på filen på kommandolinjen.

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

Proces-id’erne vises på en simpel liste.

Brug OG- og ELLER-søgninger

Lad os liste de filer, der er blevet åbnet af brugeren Mary, som er relateret til SSH-processerne. Vi ved, at vi kan levere mere end ét søgeelement på kommandolinjen, så det burde være nemt.

sudo lsof -u mary -c ssh

Lad os nu se på outputtet fra lsof. Det ser ikke rigtigt ud; der er indgange i outputtet, der blev startet med root.

Det var ikke, hvad vi forventede. Hvad skete der?

Når du angiver flere søgetermer, vil lsof returnere enhver fil, der matcher det første søgeord eller det andet søgeord, og så videre. Med andre ord udfører den en ELLER-søgning.

  Sådan monteres eksterne harddiske i Linux

For at få lsof til at udføre en OG-søgning, brug -a (og) muligheden. Det betyder, at de eneste filer, der vil blive opført, vil være dem, der matcher det første søgeord og det andet søgeudtryk og så videre.

Lad os prøve det igen og bruge -a-indstillingen.

sudo lsof -u mary -c ssh -a

Nu er hver fil i listen en, der er blevet åbnet af eller på vegne af Mary, og er forbundet med SSH-kommandoen.

Automatisk opdatering af skærmen

Vi kan bruge muligheden +|-r (gentag) til at sætte lsof i gentagelsestilstand. Gentag-indstillingen kan anvendes på to måder, enten +r eller -r. Vi skal også tilføje det antal sekunder, vi ønsker at vente, før vi opdaterer displayet.

Brug af gentag-indstillingen i begge formater får lsof til at vise resultaterne som normalt, men det tilføjer en stiplet linje til bunden af ​​displayet. Den venter på det antal sekunder, der er angivet på kommandolinjen, og opdaterer derefter skærmen med et nyt sæt resultater.

Med indstillingen -r vil dette fortsætte, indtil du trykker på Ctrl+C. Med +r-formatet fortsætter det, indtil der ikke er nogen resultater at vise, eller indtil du trykker på Ctrl+C.

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

Bemærk den stiplede linje i bunden af ​​listen. Dette adskiller hver ny visning af data, når outputtet opdateres.

Visning af filer forbundet med internetforbindelser

Indstillingen -i (internet) giver dig mulighed for at se de filer, der åbnes af processer forbundet med netværks- og internetforbindelser.

lsof -i

Alle filer, der åbnes af netværks- og internetforbindelser, vises.

Viser filer knyttet til internetforbindelser efter proces-id

For at se de filer, der åbnes af internetforbindelser, der er knyttet til et bestemt proces-id, skal du tilføje -p-indstillingen og -a-indstillingen.

Her leder vi efter filer åbnet af en internet- eller netværksforbindelse, ved en proces med et ID på 606.

sudo lsof -i -a -p 606

Alle de filer, der åbnes af proces-ID 606, der er forbundet med internet- eller netværksforbindelser, vises.

Visning af filer forbundet med internetforbindelser og kommandoer

Vi kan bruge muligheden -c (kommando) til at søge efter filer, der er åbnet af specifikke processer. For at søge efter filer, der er blevet åbnet af internet- eller netværksforbindelser forbundet med ssh-processen, skal du bruge følgende kommando:

lsof -i -a -c ssh

Alle de filer, der er åbnet på grund af ssh-processerne, er angivet i outputtet.

Visning af filer forbundet med internetforbindelser og porte

Vi kan lave lsof rapporter om de filer, der blev åbnet af internet eller netværksforbindelser på en bestemt port. For at gøre dette bruger vi tegnet : efterfulgt af portnummeret.

Her beder vi lsof om at liste de filer, der er blevet åbnet af netværk eller internetforbindelser ved hjælp af port 22.

lsof -i :22

Alle de listede filer blev åbnet af processer forbundet med port 22 (som er standardporten for SSH-forbindelser).

Visning af filer forbundet med internetforbindelser og protokoller

Vi kan bede lsof om at vise de filer, der er blevet åbnet af processer forbundet med netværks- og internetforbindelser, som bruger en bestemt protokol. Vi kan vælge mellem TCP, UDP og SMTP. Lad os bruge TCP-protokollen og se, hvad vi får.

sudo lsof -i tcp

De eneste filer, der er anført, er dem, der åbnes af processer, der bruger TCP-protokollen.

Vi har kun ridset overfladen

Det er en god forankring i nogle almindelige anvendelsestilfælde for lsof, men der er meget mere i det end det. Hvor meget mere kan man bedømme ud fra det faktum, at man-siden er over 2.800 linjer lang.

lsof-kommandoen kan bruges til at bore stadigt dybere ned i lagene af åbne filer og pseudo-filer. Vi har leveret et skitsekort; atlasset er inde man-siden.