Linux alatt sok objektum fájlnak számít, függetlenül attól, hogy az objektum valójában fájl, eszköz, könyvtár vagy socket. A fájl listázása egyszerű, ehhez be van építve a shell ls. De mi van akkor, ha a felhasználó látni szeretné, hogy mely fájlokat nyitja meg éppen a webszerver folyamata? Vagy ha a felhasználó meg akarja tudni, hogy egy bizonyos könyvtárban mely fájlok nyílnak meg? Itt lsofjön képbe. Képzeld el, lsofmint a ls"nyitott fájlok" hozzáadásával.
Kérjük, vegye figyelembe, hogy míg a BSD-k más segédprogramokkal rendelkeznek ehhez a feladathoz, fstata Unix számos más íze (például a Solaris) is rendelkezik lsof. A többi platformon eltérnek az opciók és zászlók, valamint a kimenet megjelenése, de általában az ebben a cikkben található ismeretek rájuk is vonatkoznak.
Először is vessünk egy pillantást a lsofkimenet formátumára és annak olvasására. A szokásos lsofparaméterek nélküli kimenet a következőhöz hasonlítana. Ezt az olvashatóság érdekében levágtuk.
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
Ezek az oszlopok a következőket jelentik:
- COMMAND – Az a folyamat, amelyhez egy megnyitott fájl tartozik, ebben a példában minden a -hoz kapcsolódik
init.
- PID – Az említett folyamat folyamatazonosító száma.
- FELHASZNÁLÓ – Az a felhasználó, aki alatt a folyamat fut. Mert
init, ez szinte mindig root.
- FD – A fájl fájlleírója, a leggyakoribb:
cwd- Az aktuális munkakönyvtár (észreveheti a hasonlóságot pwdaz aktuális munkakönyvtárat kinyomtató paranccsal).
rtd - Egy folyamat gyökérkönyvtára.
txt- A text file, ez jelenthet a folyamathoz kapcsolódó konfigurációs fájlt vagy a folyamathoz kapcsolódó (vagy ahhoz tartozó) "forráskódot".
mem - Egy úgynevezett "memórialeképezett fájl", ami a virtuális memória (értsd: RAM) egy szegmensét jelenti, amely egy fájlhoz van hozzárendelve.
- Egy szám – a szám a tényleges fájlleírót jelöli, a szám utáni karakter pedig a fájl megnyitásának módja:
r - Olvas.
w - Ír.
u - Olvass és írj.
- TÍPUS – Megadja a fájl tényleges típusát, a leggyakoribbak a következők:
REG - Egy normál fájl.
DIR - Egy telefonkönyv.
FIFO - Először be, először ki.
- ESZKÖZ – A fájlt tároló eszköz fő és mellékszáma.
- MÉRET – A fájl mérete bájtban.
- NODE – A fájl inode száma.
- NÉV – A fájl neve.
Ez most egy kicsit nyomasztó lehet, de ha lsofnéhányszor dolgozol vele , gyorsan elmerül az agyadban.
Mint fentebb említettük, a kimenete lsofitt lerövidült. Argumentumok és szűrők nélkül lsoftöbb száz soros kimenetet állít elő, ami csak zavarba ejti.
Két alapvető megközelítés létezik a probléma megoldására:
- Használjon egy vagy több
lsofparancssori lehetőséget az eredmények szűkítéséhez.
- Vezesse át a kimenetet például:
grep.
Bár az utóbbi lehetőség kényelmesebbnek hangzik, mivel nem kell megjegyeznie a lsofparancssori beállításokat, általában nem olyan rugalmas és hatékony, ezért maradunk az elsőnél.
Képzeljük el, hogy a kedvenc szövegszerkesztővel szeretnénk megnyitni egy fájlt, és a szövegszerkesztő azt mondja, hogy csak olvasható módban nyitható meg, mert egy másik program már hozzáfér. lsofsegít kideríteni, ki az elkövető:
lsof /path/to/your/file
Ez a következőhöz hasonló kimenetet eredményez:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2679 root 5w REG 254,1 121525 6035622 /root/lsof.txt
Úgy tűnik, elfelejtetted bezárni és régebbi munkamenetet! Nagyon hasonló probléma történik, amikor megpróbál leválasztani egy NFS-megosztást, és umountközli, hogy ez nem sikerül, mert valami még mindig hozzáfér a csatlakoztatott mappához. Ismét lsofsegíthet a tettes azonosításában:
lsof +D /path/to/your/directory/
Figyeld meg a perjelet, ez fontos. Ellenkező esetben lsofazt feltételezi, hogy normál fájlra gondol. Ne tévesszen meg a +zászló előtt - lsofannyi parancssori opciót tartalmaz, amelyekre +a gyakoribbak mellett szüksége van -. A kimenet így nézne ki:
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
Ez azt jelenti, hogy a felhasználóhoz tartozó mocpPID-vel rendelkező folyamat megnyitott egy nevű fájlt . Azonban még a folyamat lezárása után is fennáll egy probléma – az NFS-kötet nem távolítható el.5637musicRMS_GNU_SONG.ogg
lsofvan egy -cjelzője, amely a megnyitott fájlokat tetszőleges folyamatnévvel jeleníti meg.
lsof -c mocp
Ez a következőképpen néz ki kimenetet eredményezne:
mocp 9383 music 4r REG 0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg
Ebben a példában van egy másik mocpfutási példány, amely megakadályozza a megosztás leválasztását. A folyamat leállítása után győződjön meg arról, hogy a felhasználónak musicnincs megnyitva más, potenciálisan problémás fájl. lsofvan egy -ujelzője egy adott felhasználó által megnyitott fájlok megjelenítéséhez. Ne feledje, hogy egy fájl nem mindig csak egy normál fájl a merevlemezen!
lsof -u music
Több felhasználót is átadhat, vesszővel elválasztva:
lsof -u music,moremusic
Egy fontos megjegyzés az alapértelmezett viselkedése lsof: az eredmények OR alapú, ami azt jelenti, hogy látni fogja a fájl eredmények megnyitott folyamatok által birtokolt vagy a felhasználó music, vagy a felhasználó moremusic. Ha olyan eredményeket szeretne látni, amelyek mindkét felhasználó tulajdonában lévő folyamatok megegyeznek, akkor át kell adnia a jelzőt -a:
lsof -au music, moremusic
Mivel mindkét felhasználó a csoportban van, a musicusersfájlokat csoport alapján is listázhatja:
lsof -g musicusers
Kombinálhatja a parancssori zászlókat is:
lsof -u music,moremusic -c mocp
or
lsof -u ^music +D /home/Music
Az utolsó sorban hozzáadtunk egy másik speciális jelzőt - ^, amely a logikai NEM-et jelenti . Ha a kimenet üres a parancs futtatása után, akkor a leválasztás nagy valószínűséggel sikeres lesz.
Az előző példákban többnyire normál fájlokat néztünk meg. Mi a helyzet az aljzatokkal és a hálózati csatlakozásokkal?
Az összes jelenlegi hálózati kapcsolat felsorolásához lsofa következő -ijelző van:
lsof -i
A kimenet hasonlít az eddig látottakhoz...
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)
... egy különbséget leszámítva: a fájlnevek vagy könyvtárak helyett az oszlopban NAMEmost már a kapcsolati információk láthatók. Minden csatlakozás a következő részekből áll:
- Jegyzőkönyv.
- Helyi gazdagépnév.
- A kapcsolat forrásportja.
- Cél DNS-név.
- Célkikötő.
- A kapcsolat állapota.
Sok más eszközhöz hasonlóan itt is leiratkozhat a DNS-nevek és -portok ( -nés -P) feloldásáról . A zászló -itovábbi paramétereket vesz fel. Megadhatja, hogy vagy nem mutatnak tcp, udpvagy icmpcsatlakozások vagy bizonyos portok:
lsof -i :25
or
lsof -i :smtp
A paraméterek ismét kombinálhatók. A következő példa...
lsof -i tcp:80
... csak a 80-as portot használó TCP kapcsolatokat jeleníti meg. Kombinálhatja a "klasszikus" fájlokból már ismert opciókkal is:
lsof -a -u httpd -i tcp
Ez megmutatja a felhasználó által megnyitott összes TCP-kapcsolatot httpd. Jegyezze fel a -ajelzőt, amely megváltoztatja a lsof(korábban említett) alapértelmezett viselkedését . Mint a legtöbb parancssori eszköz esetében, itt is nagyon mélyre lehet menni. Az alábbiak csak azokat a TCP-kapcsolatokat jelenítik meg, amelyek állapota "LEÉPTETETT":
lsof -i -s TCP:ESTABLISHED
Ezen a ponton alapvető ismeretekkel kell rendelkeznie a lsofműködésről, valamint néhány általános használati esetről. További olvasnivalókért tekintse lsofmeg a rendszer kézikönyvét .