Pod Linuxom se mnogi objekti smatraju datotekom, bez obzira na to je li objekt zapravo datoteka, uređaj, direktorij ili utičnica. Navođenje datoteke je jednostavno, za to je ugrađena ljuska ls. Ali što ako korisnik želi vidjeti koje datoteke trenutno otvara proces web poslužitelja? Ili ako je taj korisnik želio saznati koje su datoteke otvorene u određenom direktoriju? Tu lsofdolazi u obzir. Zamislite lsofkao lss dodatkom "otvorenih datoteka".
Imajte na umu da iako BSD-ovi imaju drugačiji uslužni program za ovaj posao fstat, nekoliko drugih tipova Unixa (Solaris, na primjer) također posjeduje lsof. Opcije i zastavice su različite na drugim platformama, kao i izgled izlaza, ali općenito bi znanje iz ovog članka trebalo biti primjenjivo i na njih.
Prvo, pogledajmo format lsofizlaza i kako ga treba čitati. Uobičajeni izlaz lsofbez ikakvih parametara bi ličio na sljedeće. Ovo je skraćeno radi čitljivosti.
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
Ovi stupci znače sljedeće:
- NAREDBA - Proces kojem pripada otvorena datoteka, u ovom primjeru sve je povezano s
init.
- PID - identifikacijski broj procesa navedenog procesa.
- KORISNIK - Korisnik pod kojim se proces izvodi. Jer
init, gotovo uvijek je root.
- FD - Deskriptor datoteke, najčešći je:
cwd- Trenutni radni imenik (možda ćete primijetiti sličnost s pwdnaredbom koja ispisuje trenutni radni imenik).
rtd - Korijenski direktorij procesa.
txt- A text file, to može značiti ili konfiguracijsku datoteku koja se odnosi na proces ili "izvorni kod" koji se odnosi na (ili pripada) procesu.
mem - Takozvana "memorija mapirana datoteka", što znači segment virtualne memorije (čitaj: RAM) koji je dodijeljen datoteci.
- Broj - broj predstavlja stvarni deskriptor datoteke, znak iza broja je način u kojem se datoteka otvara:
r - Čitati.
w - Napiši.
u - Čitati i pisati.
- TYPE - Određuje stvarnu vrstu datoteke, najčešće su:
REG - Običan dosje.
DIR - Imenik.
FIFO - Prvi ušao, prvi izašao.
- UREĐAJ - Glavni i sporedni broj uređaja koji drži datoteku.
- VELIČINA - Veličina datoteke, u bajtovima.
- ČVOR - Inode broj datoteke.
- NAME - Naziv datoteke.
Ovo bi za sada moglo biti malo neodoljivo, ali ako radite s njima lsofnekoliko puta, brzo će vam utonuti u mozak.
Kao što je gore spomenuto, izlaz lsofje ovdje skraćen. Bez ikakvih argumenata ili filtara, lsofproizvodi stotine izlaznih linija što će vas samo zbuniti.
Postoje dva osnovna pristupa rješavanju tog problema:
- Upotrijebite jednu ili više
lsofopcija naredbenog retka da suzite rezultate.
- Provedite izlaz kroz, na primjer,
grep.
Iako potonja opcija može zvučati ugodnije budući da nećete morati pamtiti opcije lsofnaredbenog retka, općenito nije tako fleksibilna i učinkovita, pa ćemo se zadržati na prvoj.
Zamislimo da želite otvoriti datoteku svojim omiljenim uređivačem teksta i da vam uređivač teksta kaže da se može otvoriti samo u načinu rada samo za čitanje jer joj drugi program već pristupa. lsofpomoći će vam da saznate tko je počinitelj:
lsof /path/to/your/file
To će proizvesti izlaz sličan ovome:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2679 root 5w REG 254,1 121525 6035622 /root/lsof.txt
Očigledno ste zaboravili zatvoriti i stariju sesiju! Vrlo sličan problem se događa kada pokušate demontirati NFS dijeljenje i umountkaže vam da ne može jer nešto još uvijek pristupa montiranoj mapi. Opet, lsofmože vam pomoći u identificiranju krivca:
lsof +D /path/to/your/directory/
Obratite pažnju na zadnju kosu crtu, to je važno. Inače lsofće se pretpostaviti da mislite na običnu datoteku. Neka vas ne zbuni oznaka +ispred - lsofima toliko opcija naredbenog retka da mu je potrebno +uz uobičajenije -. Izlaz bi izgledao ovako:
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
To znači da je proces mocps PID-om 5637koji pripada korisniku musicotvorio datoteku pod nazivom RMS_GNU_SONG.ogg. Međutim, čak i nakon zatvaranja tog procesa, još uvijek postoji problem - NFS volumen se ne može isključiti.
lsofima -czastavicu koja prikazuje datoteke otvorene proizvoljnog naziva procesa.
lsof -c mocp
To bi proizvelo rezultat koji bi izgledao ovako:
mocp 9383 music 4r REG 0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg
U ovom primjeru postoji još jedna instanca mocppokretanja koja vas sprječava da demontirate dijeljenje. Nakon što zatvorite taj proces, želite biti sigurni da korisnik musicnema otvorenih drugih potencijalno problematičnih datoteka. lsofima -uzastavicu za prikaz datoteka koje je otvorio određeni korisnik. Zapamtite, datoteka nije uvijek samo obična datoteka na vašem tvrdom disku!
lsof -u music
Također možete proslijediti nekoliko korisnika, odvojenih zarezima:
lsof -u music,moremusic
Važna napomena na zadanom ponašanju lsof: rezultati su ili based, što znači da ćete vidjeti rezultate datoteka otvaraju procesi koji su u vlasništvu ili korisnika music, ili korisnika moremusic. Ako želite vidjeti rezultate koji se podudaraju s procesima koji su u vlasništvu oba korisnika, tada biste morali proslijediti zastavicu -a:
lsof -au music, moremusic
Budući da su oba korisnika u grupi musicusers, možete i navesti datoteke na temelju grupe:
lsof -g musicusers
Također možete kombinirati zastavice naredbenog retka:
lsof -u music,moremusic -c mocp
or
lsof -u ^music +D /home/Music
U posljednjem retku dodali smo još jednu posebnu zastavicu - ^, što znači logično NE . Ako je izlaz prazan nakon pokretanja te naredbe, tada će demontaža najvjerojatnije biti uspješna.
U prethodnim primjerima uglavnom smo gledali obične datoteke. Što je s utičnicama i mrežnim priključcima?
Za popis svih trenutnih mrežnih veza lsofima -izastavicu:
lsof -i
Rezultat izgleda slično onome što smo do sada vidjeli...
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)
... osim jedne razlike: umjesto naziva datoteka ili direktorija, stupac NAMEsada prikazuje informacije o vezi. Svaka veza se sastoji od sljedećih dijelova:
- Protokol.
- Lokalno ime hosta.
- Izvorni port veze.
- Odredišni DNS naziv.
- Odredišna luka.
- Status veze.
Kao i kod mnogih drugih alata, vi svibanj isključiti iz rješavanja DNS imena i luka ( -ni -P, respektivno). Zastava -iuzima dodatne parametre. Možete odrediti hoće li se prikazati ili ne tcp, udpili icmpveze ili određeni portovi:
lsof -i :25
or
lsof -i :smtp
Opet, parametri se mogu kombinirati. Sljedeći primjer...
lsof -i tcp:80
... će vam pokazati samo TCP veze koje koriste port 80. Također ga možete kombinirati s opcijama koje već poznajete iz "klasičnih" datoteka:
lsof -a -u httpd -i tcp
Ovo će vam pokazati sve TCP veze koje je otvorio korisnik httpd. Obratite pažnju na -azastavu koja mijenja zadano ponašanje lsof(kao što je ranije spomenuto). Kao i kod većine alata naredbenog retka, možete ići iznimno duboko. Sljedeće će vam pokazati samo TCP veze čije je stanje "USTABLISHED":
lsof -i -s TCP:ESTABLISHED
U ovom trenutku trebali biste imati osnovno razumijevanje o tome kako lsoffunkcionira, zajedno s nekim uobičajenim slučajevima upotrebe. Za daljnje čitanje, pogledajte stranicu s priručnikom lsofna vašem sustavu.