Dersom alt i Linux er definert som en fil, må det nødvendigvis omfatte mer enn bare de tradisjonelle filene lagret på harddisken. Denne veiledningen vil demonstrere hvordan du kan anvende `lsof`-kommandoen for å observere alle de øvrige enhetene og prosessene som behandles som filer i systemet ditt.
Alt i Linux er En Fil
Den ofte gjentatte påstanden om at alt i Linux er en fil, har en kjerne av sannhet i seg. En fil består i bunn og grunn av en samling bytes. Når disse bytesene leses inn i et program eller sendes til en skriver, oppfattes de som en strøm av data. Når bytesene skrives til en fil, aksepterer den også en strøm av data.
Flere andre komponenter i systemet fungerer på samme måte, ved å enten akseptere eller generere slike datastrømmer. Dette inkluderer for eksempel tastaturer, nettverkskontakter, skrivere og kommunikasjonsprosesser. Siden disse enhetene både kan akseptere, generere, eller begge deler, datastrømmer, kan de opereres på – på et fundamentalt nivå – som om de faktisk var filer.
Denne designfilosofien har i stor grad forenklet utviklingen av Unix-operativsystemet. Det tillot at et mindre sett med håndterere, verktøy og API-er kunne konstrueres for å håndtere et bredt spekter av forskjellige ressurser.
De tradisjonelle data- og programfilene som ligger på harddisken, er klassiske eksempler på filsystemfiler. Vi kan bruke kommandoen `ls` for å liste disse opp og få innsikt i detaljer om dem.
Men hvordan finner vi ut av de øvrige prosessene og enhetene som håndteres som filer? Her kommer `lsof`-kommandoen inn i bildet. Denne viser alle åpne filer i systemet, det vil si, alt som håndteres som en fil.
`lsof`-kommandoen
Mange av prosessene eller enhetene som `lsof` rapporterer om, tilhører systemets administrator (root) eller ble startet av root. Derfor er det nødvendig å bruke `sudo`-kommandoen i kombinasjon med `lsof`.
Siden resultatlisten ofte er omfattende, vil vi vise den ved hjelp av `less`-kommandoen for å navigere gjennom den.
sudo lsof | less
Før `lsof` sin utskrift vises, kan GNOME-brukere se en varselmelding i terminalvinduet.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete.
`lsof` forsøker å behandle alle monterte filsystemer. Denne varslingen dukker opp fordi `lsof` har støtt på et GNOME virtuelt filsystem (GVFS). Dette er et spesielt tilfelle av et filsystem i brukerområdet (FUSE). Det fungerer som en bro mellom GNOME, API-ene og kjernen. Ingen, ikke engang root, kan få tilgang til disse filsystemene, bortsett fra eieren som monterte det (i dette tilfellet GNOME). Du kan trygt ignorere denne varslingen.
Utskriften fra `lsof` er bred. Kolonnene lengst til venstre inneholder:
Kolonnene lengst til høyre inneholder:
Kolonnebeskrivelser for `lsof`
Det er viktig å være klar over at ikke alle kolonner er relevante for alle typer åpne filer. Det er helt normalt at noen av dem er tomme.
Her er en oversikt over hva hver kolonne betyr:
Kommando | Navnet på kommandoen som er assosiert med prosessen som har åpnet filen. |
PID | Prosessidentifikasjonsnummeret (PID) for prosessen som åpnet filen. |
TID | Oppgave- (tråd-) identifikasjonsnummer. En tom kolonne indikerer at det ikke er en tråd, men en prosess. |
Bruker | Bruker-ID eller navn på brukeren som eier prosessen, eller bruker-ID eller påloggingsnavn til personen som eier katalogen i `/proc` hvor `lsof` henter informasjon om prosessen. |
FD | Filbeskrivelsen til filen. Disse beskrives nærmere nedenfor. |
Type | Type node assosiert med filen. Disse beskrives nærmere nedenfor. |
Enhet | Inneholder enten enhetsnumrene, separert med komma, for en spesialtegn, blokkspesiell, vanlig, katalog eller NFS-fil, eller en kjerne-referanseadresse 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 antall bytes. |
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 hvor filen er plassert. |
FD-kolonnen
Filbeskrivelsen i FD-kolonnen kan ha en rekke ulike verdier. Man-siden lister alle.
FD-kolonnen kan bestå av tre deler: en filbeskrivelse, et modustegn og et låsetegn. Noen vanlige filbeskrivelser inkluderer:
- cwd: Gjeldende arbeidskatalog.
- err: 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 ha en av følgende verdier:
- r: Lesetilgang.
- w: Skrivetilgang.
- u: Lese- og skrivetilgang.
- (mellomrom): Modusen er ukjent, og det er ikke noe låsetegn.
- –: Modusen er ukjent, men det er et låsetegn.
Låsetegnet kan være et av følgende:
- r: Leselås på en del av filen.
- R: Leselå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.
- (mellomrom): Ingen lås.
TYPE-kolonnen
Det finnes over 70 oppføringer som kan vises i TYPE-kolonnen. Her er noen av de vanligste:
- REG: Vanlig filsystemfil.
- DIR: Katalog.
- FIFO: Først inn, først ut.
- CHR: Tegnspesialfil.
- BLK: Blokkspesialfil.
- INET: Internett-kontakt.
- unix: UNIX-domenekontakt.
Se hvilke prosesser som har åpnet en bestemt fil
For å se hvilke prosesser som har åpnet en bestemt fil, gir du filens navn som parameter til `lsof`. Hvis du for eksempel vil se hvilke prosesser som har åpnet filen `kern.log`, bruker du denne kommandoen:
sudo lsof /var/log/kern.log
`lsof` vil svare ved å vise prosessen, `rsyslogd`, som ble startet av brukeren `syslog`.
Se alle filer som er åpnet fra en katalog
For å se filene som er åpnet fra en gitt katalog, og prosessene som har åpnet dem, gir du katalogen som parameter til `lsof`. Du må også bruke alternativet `+D` (katalog).
Hvis du for eksempel vil se alle filer som er åpne i katalogen `/var/log/`, bruker du 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 katalogen `/home`, bruker du følgende kommando:
sudo lsof +D /home
Filene som er åpnet fra `/home`-katalogen vil nå vises. Legg merke til at med kortere beskrivelser i noen av kolonnene, blir hele oppføringen smalere.
Liste filer åpnet av en bestemt prosess
For å se hvilke filer som er åpnet av en bestemt prosess, bruker du alternativet `-c` (kommando). Du kan angi mer enn ett søkeord til `lsof` samtidig.
sudo lsof -c ssh -c init
`lsof` returnerer en liste over filene som er åpnet av en av prosessene som er angitt på kommandolinjen.
Se filer åpnet av en bestemt bruker
For å begrense visningen til filene som er åpnet av en bestemt bruker, bruker du alternativet `-u` (bruker). I dette eksemplet skal vi se på filene som er åpnet av prosesser som eies eller startes på vegne av brukeren `mary`.
sudo lsof -u mary
Alle de oppførte filene er åpnet på vegne av brukeren `mary`. Dette inkluderer filer som for eksempel er åpnet av skrivebordsmiljøet, eller som er et resultat av at `mary` har logget seg på.
Ekskluder filer åpnet av en bruker
For å ekskludere filene som er åpnet av en bruker, bruker du operatoren `^`. Å ekskludere brukere fra listen gjør det lettere å finne den informasjonen du er interessert i. Du bruker alternativet `-u` som før, men legger til tegnet `^` i begynnelsen av brukerens navn.
sudo lsof +D /home -u ^mary
Denne gangen vil ikke listen for `/home`-katalogen inkludere noen av filene som er åpnet av brukeren `mary`.
Liste filer åpnet av en bestemt prosess-ID
For å liste filene som er åpnet av en bestemt prosess, bruker du alternativet `-p` (prosess) og angir prosess-ID-en som parameter.
sudo lsof - p 4610
Alle filene som er åpnet av prosessen med den angitte prosess-ID-en vises.
Liste over prosess-ID-er som har åpnet en fil
For å se prosess-ID-ene til prosessene som har åpnet en bestemt fil, bruker du alternativet `-t` (terse) og angir filens navn på kommandolinjen.
sudo lsof -t /usr/share/mime/mime.cache
Prosess-ID-ene vises i en enkel liste.
Bruk logisk OG og ELLER i søk
La oss se på filene som er åpnet av brukeren `mary`, og som er relatert til SSH-prosesser. Vi vet at vi kan angi mer enn ett søkeelement på kommandolinjen, så dette burde være enkelt.
sudo lsof -u mary -c ssh
La oss nå se på utskriften fra `lsof`. Det ser ikke riktig ut; det finnes oppføringer i utdataene som er startet med root.
Det var ikke det vi forventet. Hva skjedde?
Når du angir 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, den utfører et ELLER-søk.
For å få `lsof` til å utføre et OG-søk, må du bruke alternativet `-a` (og). Dette betyr at de eneste filene som vises vil være de som samsvarer med både det første, andre og så videre søkeord.
La oss prøve igjen med alternativet `-a`.
sudo lsof -u mary -c ssh -a
Nå er hver fil i oppføringen åpnet av eller på vegne av brukeren `mary`, og er knyttet til SSH-kommandoen.
Oppdater skjermen automatisk
Vi kan bruke alternativet `+|-r` (gjenta) for å sette `lsof` i repetisjonsmodus. Repetisjonsalternativet kan brukes på to måter, enten `+r` eller `-r`. Vi må også legge til antall sekunder vi ønsker at `lsof` skal vente før skjermen oppdateres.
Ved å bruke gjenta-alternativet i begge formater, viser `lsof` resultatene som vanlig, men legger til en stiplet linje nederst på skjermen. Den venter på det angitte antall sekunder og oppdaterer deretter skjermen med et nytt sett med resultater.
Med alternativet `-r`, fortsetter dette til du trykker `Ctrl+C`. Med formatet `+r`, fortsetter det til det ikke er flere 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.
Vis filer tilknyttet Internett-tilkoblinger
Alternativet `-i` (internett) lar deg se filene som åpnes av prosesser som er koblet til nettverks- og internettforbindelser.
lsof -i
Alle filene som er åpnet av nettverks- og internettforbindelser vises.
Viser filer knyttet til Internett-tilkoblinger etter prosess-ID
For å se filene som er åpnet av internettforbindelser og som er knyttet til en bestemt prosess-ID, legger du til alternativene `-p` og `-a`.
Her ser vi etter filer som er åpnet av en internett- eller nettverkstilkobling, via en prosess med ID 606.
sudo lsof -i -a -p 606
Alle filene som er åpnet av prosess-ID 606 og som er knyttet til internett- eller nettverkstilkoblinger, vises.
Viser 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 er åpnet av internett- eller nettverkstilkoblinger knyttet til SSH-prosessen, bruker du følgende kommando:
lsof -i -a -c ssh
Alle filene som er åpnet på grunn av SSH-prosessene vises i utdataene.
Viser filer knyttet til Internett-tilkoblinger og porter
Vi kan be `lsof` rapportere om filene som er å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 opp filene som er åpnet av nettverks- eller internettforbindelser ved bruk av port 22.
lsof -i :22
Alle de oppførte filene er åpnet av prosesser knyttet til port 22 (som er standardporten for SSH-tilkoblinger).
Viser 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 benytter 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 vises er de som er åpnet av prosesser som bruker TCP-protokollen.
Vi har bare skrapet på overflaten
Dette gir et innblikk i noen av de mest vanlige bruksområdene for `lsof`. Det finnes mange flere muligheter. Man-siden for `lsof` er over 2800 linjer lang, noe som indikerer at det finnes et stort antall funksjoner.
`lsof