Under Linux regnes mange objekter som en fil, uavhengig av om objektet faktisk er en fil, enhet, katalog eller stikkontakt. Det er enkelt å liste en fil, det er skallet innebygd lsfor det. Men hva om en bruker ønsket å se hvilke filer som for øyeblikket åpnes av webserverprosessen? Eller om den brukeren ønsket å finne ut hvilke filer som er åpnet i en bestemt katalog? Det er der som lsofspiller inn. Tenk deg lsofsom en lsmed tillegg av "åpne filer".
Vær oppmerksom på at mens BSD-ene har et annet verktøy for denne jobben, fstathar flere andre varianter av Unix (Solaris, for eksempel) også lsof. Alternativene og flaggene er forskjellige på de andre plattformene, så vel som utseendet på utdataene, men generelt bør kunnskapen i denne artikkelen også være aktuelt for dem.
La oss først se på lsofutdataformatet og hvordan det skal leses. Den vanlige utgangen lsofuten noen parametere vil ligne følgende. Dette er trimmet for lesbarhet.
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 254,1 4096 2 /
init 1 root rtd DIR 254,1 4096 2 /
init 1 root txt REG 254,1 36992 7077928 /sbin/init
init 1 root mem REG 254,1 14768 7340043 /lib/x86_64-linux-gnu/libdl-2.13.so
init 1 root mem REG 254,1 1603600 7340040 /lib/x86_64-linux-gnu/libc-2.13.so
init 1 root mem REG 254,1 126232 7340078 /lib/x86_64-linux-gnu/libselinux.so.1
init 1 root mem REG 254,1 261184 7340083 /lib/x86_64-linux-gnu/libsepol.so.1
init 1 root mem REG 254,1 136936 7340037 /lib/x86_64-linux-gnu/ld-2.13.so
init 1 root 10u FIFO 0,14 0t0 4781 /run/initctl
Disse kolonnene betyr følgende:
- COMMAND - Prosessen som en åpen fil tilhører, i dette eksemplet er alt relatert til
init.
- PID - Prosessidentifikasjonsnummeret til nevnte prosess.
- BRUKER - Brukeren som prosessen kjører under. For
init, det er nesten alltid root.
- FD - Filbeskrivelsen til filen, den vanligste er:
cwd- Den gjeldende arbeidskatalogen (du vil kanskje legge merke til likheten med pwdkommandoen som skriver ut den gjeldende arbeidskatalogen).
rtd - Rotkatalogen til en prosess.
txt- A text file, dette kan enten bety en konfigurasjonsfil relatert til prosessen eller "kildekoden" relatert til (eller tilhører) prosessen.
mem - En såkalt "memory mapped file", det vil si et segment av virtuelt minne (les: RAM) som er tilordnet en fil.
- Et tall - tallet representerer den faktiske filbeskrivelsen, tegnet etter tallet er modusen som filen åpnes i:
r - Les.
w - Skrive.
u - Lese og skrive.
- TYPE - Spesifiserer den faktiske typen fil, de vanligste er:
REG - En vanlig fil.
DIR - En katalog.
FIFO - Først inn først ut.
- ENHET - Hoved- og undernummeret til enheten som inneholder filen.
- STØRRELSE - Størrelsen på filen, i byte.
- NODE - Inodenummeret til filen.
- NAME – Navnet på filen.
Dette kan være litt overveldende foreløpig, men hvis du jobber med lsofet par ganger, vil det raskt synke inn i hjernen din.
Som nevnt ovenfor er produksjonen av lsofblitt forkortet her. Uten noen argumenter eller filtre, lsofproduserer hundrevis av utdatalinjer som bare vil gjøre deg forvirret.
Det er to grunnleggende tilnærminger for å løse dette problemet:
- Bruk ett eller flere av
lsofkommandolinjealternativene for å begrense resultatene.
- Rør utgangen gjennom for eksempel
grep.
Selv om det siste alternativet kan høres mer behagelig ut siden du ikke trenger å huske lsofkommandolinjealternativene, er det generelt ikke så fleksibelt og effektivt, så vi holder oss til det første.
La oss forestille oss at du vil åpne en fil med favoritttekstredigeringsprogrammet ditt, og at tekstredigeringsprogrammet forteller deg at den kun kan åpnes i skrivebeskyttet modus fordi et annet program allerede har tilgang til den. lsofvil hjelpe deg å finne ut hvem gjerningsmannen er:
lsof /path/to/your/file
Dette vil produsere en utgang som ligner på dette:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2679 root 5w REG 254,1 121525 6035622 /root/lsof.txt
Tilsynelatende har du glemt å lukke og eldre økt! Et svært lignende problem oppstår når du prøver å avmontere en NFS-ressurs og umountforteller deg at det ikke kan fordi noe fortsatt har tilgang til den monterte mappen. Igjen, lsofkan hjelpe deg med å identifisere den skyldige:
lsof +D /path/to/your/directory/
Legg merke til den etterfølgende skråstreken, det er viktig. Ellers lsofvil du anta at du mener en vanlig fil. Ikke bli forvirret av den +foran flagget - lsofhar så mange kommandolinjealternativer som den trenger +i tillegg til de mer vanlige -. Utgangen vil se slik ut:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mocp 5637 music 4r REG 0,19 10147719 102367344 /home/Music/RMS_GNU_SONG.ogg
Det betyr at prosessen mocpmed PID som 5637tilhører brukeren musichar åpnet en fil kalt RMS_GNU_SONG.ogg. Men selv etter at du har lukket den prosessen, er det fortsatt et problem - NFS-volumet kan ikke demonteres.
lsofhar et -cflagg som viser åpnede filer et vilkårlig prosessnavn.
lsof -c mocp
Det vil gi en utgang som ser slik ut:
mocp 9383 music 4r REG 0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg
I dette eksemplet er det en annen forekomst av mocpkjøring, som hindrer deg i å demontere delingen. Etter å ha stengt den prosessen, vil du forsikre deg om at brukeren ikke musichar andre potensielt problematiske filer åpne. lsofhar et -uflagg for å vise filer åpnet av en bestemt bruker. Husk at en fil ikke alltid bare er en vanlig fil på harddisken din!
lsof -u music
Du kan også sende flere brukere, atskilt med komma:
lsof -u music,moremusic
En viktig merknad om standardoppførselen til lsof: resultatene er ELLER- baserte, noe som betyr at du vil se filresultater åpnet av prosesser som eies av enten brukeren musiceller brukeren moremusic. Hvis du ønsker å se resultater som samsvarer med prosesser som eies av begge brukerne, må du sende flagget -a:
lsof -au music, moremusic
Siden begge brukerne er i gruppen musicusers, kan du også liste filer basert på gruppe:
lsof -g musicusers
Du kan også kombinere kommandolinjeflagg:
lsof -u music,moremusic -c mocp
or
lsof -u ^music +D /home/Music
I den siste linjen la vi til et annet spesialflagg - ^, som står for et logisk IKKE . Hvis utgangen er tom etter å ha kjørt den kommandoen, vil demonteringen mest sannsynlig være vellykket.
I de forrige eksemplene så vi stort sett på vanlige filer. Hva med stikkontakter og nettverkstilkoblinger?
For å liste opp alle gjeldende nettverkstilkoblinger lsofhar -iflagget:
lsof -i
Utgangen ligner på det vi har sett så langt...
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
owncloud 3509 myuser 25u IPv4 44946 0t0 TCP strix.local:34217->myserver.vultr.com:https (ESTABLISHED)
firefox 3612 myuser 82u IPv4 49663 0t0 TCP strix.local:43897->we-in-f100.1e100.net:https (ESTABLISHED)
ssh 3784 myuser 3u IPv4 10437 0t0 TCP strix.local:51416->someserver.in:ssh (ESTABLISHED)
wget 4140 myuser 3w IPv4 45586 0t0 TCP strix.local:54460->media.ccc.de:http (CLOSE_WAIT)
... bortsett fra én forskjell: i stedet for filnavn eller kataloger, viser kolonnen NAMEnå tilkoblingsinformasjon. Hver tilkobling består av følgende deler:
- Protokoll.
- Lokalt vertsnavn.
- Kildeport for tilkoblingen.
- Destinasjons-DNS-navn.
- Destinasjonshavn.
- Status for tilkoblingen.
Som med mange andre verktøy, kan du melde deg ut av løse DNS-navn og porter ( -nog -Phenholdsvis). Flagget -itar flere parametere. Du kan spesifisere om du vil vise tcp, udpeller icmptilkoblinger eller visse porter:
lsof -i :25
or
lsof -i :smtp
Igjen kan parametere kombineres. Følgende eksempel...
lsof -i tcp:80
... vil bare vise deg TCP-tilkoblinger som bruker port 80. Du kan også kombinere det med alternativene du allerede kjenner fra "klassiske" filer:
lsof -a -u httpd -i tcp
Dette vil vise deg alle TCP-tilkoblinger som er åpnet av brukeren httpd. Legg merke til -aflagget, som endrer standardoppførselen til lsof(som nevnt tidligere). Som med de fleste kommandolinjeverktøy, kan du gå ekstremt dypt. Følgende vil bare vise deg TCP-forbindelser hvis tilstand er "ETABLISERT":
lsof -i -s TCP:ESTABLISHED
På dette tidspunktet bør du ha en grunnleggende forståelse av hvordan lsoffungerer, sammen med noen vanlige brukstilfeller. For ytterligere lesing, se manpage lsofpå systemet ditt.