Slik bruker du Linux lsof-kommandoen

Hvis alt i Linux er en fil, må det være mer enn bare filer på harddisken. Denne opplæringen viser deg hvordan du bruker lsof til å se alle andre enheter og prosesser som håndteres som filer.

På Linux er alt en fil

Den ofte siterte setningen om at alt i Linux er en fil er på en måte sant. En fil er en samling av bytes. Når de blir lest inn i et program eller sendt til en skriver, ser det ut til at de genererer en strøm av byte. Når de blir skrevet til, godtar de en strøm av byte.

Mange andre systemkomponenter aksepterer eller genererer strømmer av byte, for eksempel tastaturer, stikkontakter, skrivere og kommunikasjonsprosesser. Fordi de enten aksepterer, genererer eller godtar og genererer bytestrømmer, kan disse enhetene håndteres – på et veldig lavt nivå – som om de var filer.

Dette designkonseptet forenklet implementeringen av Unix-operativsystemet. Det betydde at et lite sett med behandlere, verktøy og APIer kunne opprettes for å håndtere et bredt spekter av forskjellige ressurser.

Dataene og programfilene som ligger på harddisken din er vanlige gamle filsystemfiler. Vi kan bruke ls-kommandoen til å liste dem opp og finne ut noen detaljer om dem.

Hvordan finner vi ut om alle de andre prosessene og enhetene som blir behandlet som om de var filer? Vi bruker lsof-kommandoen. Dette viser de åpne filene i systemet. Det vil si at den viser alt som blir håndtert som om det var en fil.

lsof-kommandoen

Mange av prosessene eller enhetene som lsof kan rapportere om, tilhører root eller ble lansert av root, så du må bruke sudo-kommandoen med lsof.

Og fordi denne oppføringen vil bli veldig lang, kommer vi til å gå gjennom den mindre.

sudo lsof | less

Før lsof-utgangen vises GNOME-brukere kan se en advarsel i terminalvinduet.

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

lsof prøver å behandle alle monterte filsystemer. Denne advarselen vises fordi lsof har støtt på en GNOME virtuelt filsystem (GVFS). Dette er et spesielt tilfelle av en filsystem i brukerområdet (LUNTE). Den fungerer som en bro mellom GNOME, API-ene og kjernen. Ingen – ikke engang root – kan få tilgang til et av disse filsystemene, bortsett fra eieren som monterte det (i dette tilfellet GNOME). Du kan ignorere denne advarselen.

  Slik spiller du Doom: Eternal på Linux

Utgangen fra lsof er veldig bred. Kolonnene lengst til venstre er:

Kolonnene lengst til høyre er:

Lsof kolonner

Alle kolonner gjelder ikke for alle typer åpne filer. Det er normalt at noen av dem er tomme.

Kommando: Navnet på kommandoen knyttet til prosessen som åpnet filen.
PID: Prosessidentifikasjonsnummer for prosessen som åpnet filen.
TID: Oppgave (tråd) Identifikasjonsnummer. En tom kolonne betyr at det ikke er en oppgave; det er en prosess.
Bruker: Bruker-ID eller navn på brukeren som prosessen tilhører, eller bruker-ID eller pålogging til personen som eier katalogen i /proc hvor lsof finner informasjon om prosessen.
FD: Viser filbeskrivelsen til filen. Filbeskrivelser er beskrevet nedenfor.
Type: type node knyttet til filen. Notetyper er beskrevet nedenfor.
Enhet: Inneholder enten enhetsnumrene, atskilt med komma, for en spesialtegn, blokkspesiell, vanlig, katalog eller NFS-fil, eller en kjernereferanseadresse som identifiserer filen. Den kan også vise basisadressen eller enhetsnavnet til en Linux AX.25-sokkelenhet.
Størrelse/Av: Viser størrelsen på filen eller filforskyvningen i byte.
Node: Viser nodenummeret til en lokal fil, eller inodenummeret til en NFS-fil i serververten, eller internettprotokolltypen. Den kan vise STR for en strøm eller IRQ- eller inodenummeret til en Linux AX.25-sokkelenhet.
Navn: Viser navnet på monteringspunktet og filsystemet som filen ligger på.

FD-kolonnen

Filbeskrivelsen i FD-kolonnen kan være ett av mange alternativer; man-siden liste dem alle.

FD-kolonneoppføringen kan bestå av tre deler: en filbeskrivelse, et modustegn og et låsetegn. Noen vanlige filbeskrivelser er:

cwd: Gjeldende arbeidskatalog.
feil: FD-informasjonsfeil (se kolonnen NAVN).
ltx: Delt bibliotektekst (kode og data).
m86: DOS Merge-tilordnet fil.
mem: Minnetilordnet fil.
mmap: Minnetilordnet enhet.
pd: Overordnet katalog.
rtd: Rotkatalog.
txt: Programtekst (kode og data)
Et tall som representerer en filbeskrivelse.

Modustegnet kan være ett av følgende:

r: Lesetilgang.
w: Skrivetilgang.
u: Lese- og skrivetilgang.
« «: Et mellomromstegn, hvis modusen er ukjent og det ikke er noe låsetegn.
–: Modus ukjent og det er et låsetegn.

Låsetegnet kan være ett av:

r: Les lås på en del av filen.
R: Les lås på hele filen.
w: Skrivelås på en del av filen.
W: Skrivelås på hele filen.
u: Lese- og skrivelås av hvilken som helst lengde.
U: Ukjent låsetype.
« «: Et mellomromstegn. Ingen lås.

TYPE-kolonnen

Det er over 70 oppføringer som kan vises i TYPE-kolonnen. Noen vanlige oppføringer du vil se er:

REG: Vanlig filsystemfil.
DIR: Katalog.
FIFO: Først inn først ut.
CHR: Tegn spesialfil.
BLK: Blokker spesialfil.
INET: Internett-kontakt.
unix: UNIX-domenekontakt

Se prosesser som har åpnet en fil

For å se prosessene som har åpnet en bestemt fil, oppgi navnet på filen som en parameter til lsof. For eksempel, for å se prosessene som har åpnet kern.log-filen, bruk denne kommandoen:

sudo lsof /var/log/kern.log

lsof svarer ved å vise enkeltprosessen, rsyslogd som ble startet av brukerens syslog.

Se alle filer åpnet fra en katalog

For å se filene som har blitt åpnet fra en katalog, og prosessene som åpnet dem, send katalogen til lsof som en parameter. Du må bruke +D (katalog) alternativet.

  Slik eksporterer og importerer du Linux-systemene dine på Windows 10

For å se alle filene som er åpne i /var/log/-katalogen, bruk denne kommandoen:

sudo lsof +D /var/log/

lsof svarer med en liste over alle åpne filer i den katalogen.

For å se alle filene som er åpnet fra /home-katalogen, bruk følgende kommando:

sudo lsof +D /home

Filene som er åpnet fra /home-katalogen vises. Merk at med kortere beskrivelser i noen av kolonnene, er hele oppføringen smalere.

Liste filer åpnet av en prosess

For å se filene som har blitt åpnet av en bestemt prosess, bruk alternativet -c (kommando). Merk at du kan gi mer enn ett søkeord til lsof samtidig.

sudo lsof -c ssh -c init

lsof gir en liste over filene som er åpnet av en av prosessene på kommandolinjen.

Se Filer åpnet av en bruker

For å begrense visningen til filene som er åpnet av en spesifikk bruker, bruk -u (bruker)-alternativet. I dette eksemplet skal vi se på filene som har blitt åpnet av prosesser som eies eller lanseres på vegne av Mary.

sudo lsof -u mary

Alle filene som er oppført er åpnet på vegne av brukeren Mary. Dette inkluderer filer som for eksempel har blitt åpnet av skrivebordsmiljøet, eller bare som et resultat av at Mary har logget på.

Ekskluderer filer åpnet av en bruker

For å ekskludere filene som er åpnet av en bruker, bruk ^-operatoren. Å ekskludere brukere fra oppføringen gjør det lettere å finne informasjonen du er interessert i. Du må bruke -u-alternativet som før, og legge til tegnet ^ i starten av brukerens navn.

sudo lsof +D /home -u ^mary

Denne gangen inkluderer ikke oppføringen for /home-katalogen noen av filene som har blitt åpnet av brukeren Mary.

Liste filer åpnet av en prosess

For å liste filene som har blitt åpnet av en bestemt prosess, bruk -p (prosess)-alternativet og oppgi prosess-ID som en parameter.

sudo lsof - p 4610

Alle filene som er åpnet av prosess-ID-en du oppgir, er oppført for deg.

Oppføring av prosess-ID-er som har åpnet en fil

For å se prosess-ID-ene for prosessene som har åpnet en bestemt fil, bruk alternativet -t (terse) og oppgi navnet på filen på kommandolinjen.

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

Prosess-ID-ene vises i en enkel liste.

Bruk OG- og ELLER-søk

La oss liste filene som har blitt åpnet av brukeren Mary, som er relatert til SSH-prosessene. Vi vet at vi kan gi mer enn ett søkeelement på kommandolinjen, så dette bør være enkelt.

sudo lsof -u mary -c ssh

La oss nå se på utgangen fra lsof. Det ser ikke riktig ut; det er oppføringer i utdataene som ble startet med root.

Det var ikke det vi forventet. Hva skjedde?

Når du oppgir flere søkeord, vil lsof returnere alle filer som samsvarer med det første søkeordet eller det andre søkeordet, og så videre. Med andre ord utfører den et ELLER-søk.

  Hvordan bruke Pale Moon-nettleseren på Linux

For å få lsof til å utføre et OG-søk, bruk alternativet -a (og). Dette betyr at de eneste filene som vil bli oppført vil være de som samsvarer med det første søkeordet, og det andre søkeordet, og så videre.

La oss prøve det igjen og bruke -a-alternativet.

sudo lsof -u mary -c ssh -a

Nå er hver fil i oppføringen en som har blitt åpnet av eller på vegne av Mary, og er knyttet til SSH-kommandoen.

Oppdaterer skjermen automatisk

Vi kan bruke +|-r (gjenta) alternativet for å sette lsof i repetisjonsmodus. Gjenta-alternativet kan brukes på to måter, enten +r eller -r. Vi må også legge til antall sekunder vi vil at lsof skal vente før du oppdaterer skjermen.

Ved å bruke gjenta-alternativet i begge formatene viser lsof resultatene som vanlig, men det legger til en stiplet linje nederst på skjermen. Den venter på antall sekunder som er oppgitt på kommandolinjen og oppdaterer deretter skjermen med et nytt sett med resultater.

Med alternativet -r vil dette fortsette til du trykker Ctrl+C. Med +r-formatet fortsetter det til det ikke er noen resultater å vise, eller til du trykker Ctrl+C.

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

Legg merke til den stiplede linjen nederst i oppføringen. Dette skiller hver ny visning av data når utdataene oppdateres.

Vise filer knyttet til Internett-tilkoblinger

Alternativet -i (internett) lar deg se filene som åpnes av prosesser knyttet til nettverks- og internettforbindelser.

lsof -i

Alle filene som åpnes av nettverks- og internettforbindelser vises.

Viser filer knyttet til Internett-tilkoblinger etter prosess-ID

For å se filene åpnet av internettforbindelser som er knyttet til en bestemt prosess-ID, legg til -p-alternativet og -a-alternativet.

Her ser vi etter filer åpnet av en internett- eller nettverkstilkobling, ved en prosess med en ID på 606.

sudo lsof -i -a -p 606

Alle filene åpnet av prosess-ID 606 som er knyttet til internett- eller nettverkstilkoblinger, vises.

Vise filer knyttet til Internett-tilkoblinger og kommandoer

Vi kan bruke alternativet -c (kommando) for å se etter filer som er åpnet av spesifikke prosesser. For å se etter filer som har blitt åpnet av internett eller nettverkstilkoblinger knyttet til ssh-prosessen, bruk følgende kommando:

lsof -i -a -c ssh

Alle filene som er åpnet på grunn av ssh-prosessene er oppført i utdataene.

Vise filer knyttet til Internett-tilkoblinger og porter

Vi kan lage lsof rapporter om filene som ble åpnet av internett eller nettverkstilkoblinger på en bestemt port. For å gjøre dette bruker vi tegnet : etterfulgt av portnummeret.

Her ber vi lsof om å liste filene som har blitt åpnet av nettverks- eller internettforbindelser ved bruk av port 22.

lsof -i :22

Alle de oppførte filene ble åpnet av prosesser knyttet til port 22 (som er standardporten for SSH-tilkoblinger).

Vise filer knyttet til Internett-tilkoblinger og protokoller

Vi kan be lsof om å vise filene som er åpnet av prosesser knyttet til nettverks- og internettforbindelser, som bruker en bestemt protokoll. Vi kan velge mellom TCP, UDP og SMTP. La oss bruke TCP-protokollen og se hva vi får.

sudo lsof -i tcp

De eneste filene som er oppført er de som er åpnet av prosesser som bruker TCP-protokollen.

Vi har bare skrapet på overflaten

Det er en god forankring i noen vanlige brukstilfeller for lsof, men det er mye mer enn det. Akkurat hvor mye mer kan bedømmes av det faktum at man-siden er over 2800 linjer lang.

lsof-kommandoen kan brukes til å bore stadig dypere inn i lagene av åpne filer og pseudo-filer. Vi har gitt et skissekart; atlaset er inne man-siden.