Jak používat Linuxový příkaz lsof

Pokud je vše v Linuxu soubor, musí toho být více než jen soubory na vašem pevném disku. Tento tutoriál vám ukáže, jak používat lsof k zobrazení všech ostatních zařízení a procesů, se kterými se zachází jako se soubory.

V Linuxu je všechno soubor

Často citovaná fráze, že vše v Linuxu je soubor, je svým způsobem pravdivá. Soubor je kolekce bajtů. Když jsou načteny do programu nebo odeslány na tiskárnu, zdá se, že generují proud bajtů. Když se do nich zapisuje, přijímají proud bajtů.

Mnoho dalších systémových komponent přijímá nebo generuje proudy bajtů, jako jsou klávesnice, připojení soketů, tiskárny a komunikační procesy. Protože buď přijímají, generují nebo přijímají a generují toky bajtů, lze s těmito zařízeními zacházet – na velmi nízké úrovni – jako by to byly soubory.

Tento koncept návrhu zjednodušil implementaci operačního systému Unix. Znamenalo to, že lze vytvořit malou sadu obslužných rutin, nástrojů a rozhraní API, aby bylo možné zpracovávat širokou škálu různých zdrojů.

Datové a programové soubory, které se nacházejí na vašem pevném disku, jsou obyčejné staré soubory systému souborů. Pomocí příkazu ls je můžeme vypsat a zjistit o nich nějaké podrobnosti.

Jak se dozvíme o všech ostatních procesech a zařízeních, se kterými se zachází, jako by to byly soubory? Používáme příkaz lsof. Zde je uveden seznam otevřených souborů v systému. To znamená, že uvádí vše, s čím se zachází, jako by to byl soubor.

Příkaz lsof

Mnoho procesů nebo zařízení, o kterých může lsof hlásit, patří rootovi nebo byly spuštěny rootem, takže budete muset použít příkaz sudo s lsof.

A protože tento seznam bude velmi dlouhý, budeme ho procházet méně .

sudo lsof | less

Před zobrazením výstupu lsof se uživatelům GNOME může v okně terminálu zobrazit varovná zpráva.

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

lsof se pokusí zpracovat všechny připojené souborové systémy. Tato varovná zpráva se zobrazuje, protože lsof narazil na a Virtuální souborový systém GNOME (GVFS). Toto je zvláštní případ a souborový systém v uživatelském prostoru (POJISTKA). Funguje jako most mezi GNOME, jeho API a jádrem. Nikdo – dokonce ani root – nemá přístup k jednomu z těchto souborových systémů, kromě vlastníka, který jej připojil (v tomto případě GNOME). Toto varování můžete ignorovat.

  Není potřeba žádný kabel: Jak streamovat zápas hvězd NBA

Výstup z lsof je velmi široký. Sloupce zcela vlevo jsou:

Sloupce zcela vpravo jsou:

lsof Columns

Všechny sloupce neplatí pro každý typ otevřeného souboru. Je normální, že některé z nich jsou prázdné.

Příkaz: Název příkazu přidruženého k procesu, který soubor otevřel.
PID: Identifikační číslo procesu procesu, který otevřel soubor.
TID: Úkol (vlákno) Identifikační číslo. Prázdný sloupec znamená, že se nejedná o úkol; je to proces.
Uživatel: ID uživatele nebo jméno uživatele, kterému proces patří, nebo ID uživatele nebo přihlašovací jméno osoby, která vlastní adresář v /proc, kde lsof najde informace o procesu.
FD: Zobrazuje deskriptor souboru. Popisy souborů jsou popsány níže.
Typ: typ uzlu přidruženého k souboru. Typy poznámek jsou popsány níže.
Zařízení: Obsahuje buď čísla zařízení oddělená čárkami pro znak speciální, blokový speciální, běžný, adresář nebo soubor NFS, nebo referenční adresu jádra, která identifikuje soubor. Může také zobrazovat základní adresu nebo název zařízení soketu Linux AX.25.
Size/Off: Zobrazuje velikost souboru nebo posun souboru v bajtech.
Uzel: Zobrazuje číslo uzlu místního souboru nebo číslo inodu souboru NFS v hostiteli serveru nebo typ internetového protokolu. Může zobrazovat STR pro stream nebo číslo IRQ nebo inode zařízení se soketem Linux AX.25.
Název: Zobrazuje název bodu připojení a systému souborů, na kterém je soubor umístěn.

Sloupec FD

Deskriptor souboru ve sloupci FD může být jednou z mnoha možností; manuálová stránka vyjmenuj je všechny.

Záznam ve sloupci FD se může skládat ze tří částí: deskriptor souboru, znak režimu a znak zámku. Některé běžné deskriptory souborů jsou:

cwd: Aktuální pracovní adresář.
err: Chyba informace FD (viz sloupec NAME).
ltx: Text sdílené knihovny (kód a data).
m86: DOS Merge mapovaný soubor.
mem: Soubor mapovaný v paměti.
mmap: Zařízení mapované v paměti.
pd: Nadřazený adresář.
rtd: Kořenový adresář.
txt: Text programu (kód a data)
Číslo představující deskriptor souboru.

Znak režimu může být jeden z následujících:

r: Přístup ke čtení.
w: Přístup pro zápis.
u: Přístup ke čtení a zápisu.
‚ ‚: Znak mezery, pokud je režim neznámý a není tam žádný znak zámku.
–: Režim neznámý a je zde znak zámku.

Znak zámku může být jeden z:

r: Zámek čtení části souboru.
R: Zámek čtení na celý soubor.
w: Zámek zápisu na část souboru.
W: Zámek zápisu na celý soubor.
u: Zámek pro čtení a zápis libovolné délky.
U: Neznámý typ zámku.
‚ : mezerník. Žádný zámek.

Sloupec TYPE

Existují přes 70 záznamů které se mohou objevit ve sloupci TYP. Některé běžné položky, které uvidíte, jsou:

REG: Běžný soubor souborového systému.
DIR: Adresář.
FIFO: First In First Out.
CHR: Speciální soubor znaků.
BLK: Blokovat speciální soubor.
INET: Internetová zásuvka.
unix: soket domény UNIX

Viz Procesy, které otevřely soubor

Chcete-li zobrazit procesy, které otevřely určitý soubor, zadejte název souboru jako parametr lsof. Chcete-li například zobrazit procesy, které otevřely soubor kern.log, použijte tento příkaz:

sudo lsof /var/log/kern.log

lsof odpoví zobrazením jediného procesu, rsyslogd, který spustil uživatel syslog.

  Jak povolit (nebo zakázat) a používat dotykový režim ve Wordu

Viz Všechny soubory otevřené z adresáře

Chcete-li zobrazit soubory, které byly otevřeny z adresáře, a procesy, které je otevřely, předejte adresář jako parametr lsof. Musíte použít volbu +D (adresář).

Chcete-li zobrazit všechny soubory, které jsou otevřené v adresáři /var/log/, použijte tento příkaz:

sudo lsof +D /var/log/

lsof odpoví seznamem všech otevřených souborů v tomto adresáři.

Chcete-li zobrazit všechny soubory, které byly otevřeny z adresáře /home, použijte následující příkaz:

sudo lsof +D /home

Zobrazí se soubory, které byly otevřeny z adresáře /home. Všimněte si, že s kratšími popisy v některých sloupcích je celý výpis užší.

Seznam souborů otevřených procesem

Chcete-li zobrazit soubory, které byly otevřeny konkrétním procesem, použijte volbu -c (příkaz). Pamatujte, že lsof můžete zadat více než jeden hledaný výraz najednou.

sudo lsof -c ssh -c init

lsof poskytuje seznam souborů, které byly otevřeny některým z procesů uvedených na příkazovém řádku.

Viz Soubory otevřené uživatelem

Chcete-li omezit zobrazení na soubory, které byly otevřeny konkrétním uživatelem, použijte volbu -u (uživatel). V tomto příkladu se podíváme na soubory, které byly otevřeny procesy, které vlastní nebo spouští jménem Mary.

sudo lsof -u mary

Všechny uvedené soubory byly otevřeny jménem uživatele Mary. To zahrnuje soubory, které byly otevřeny například v desktopovém prostředí nebo jednoduše v důsledku přihlášení Marie.

S výjimkou souborů otevřených uživatelem

Chcete-li vyloučit soubory, které byly otevřeny uživatelem, použijte operátor ^. Vyloučení uživatelů ze seznamu usnadňuje nalezení informací, které vás zajímají. Musíte použít volbu -u jako dříve a na začátek jména uživatele přidat znak ^.

sudo lsof +D /home -u ^mary

Výpis pro adresář /home tentokrát nezahrnuje žádný ze souborů, které byly otevřeny uživatelem Mary.

Zobrazit seznam souborů otevřených procesem

Chcete-li vypsat soubory, které byly otevřeny konkrétním procesem, použijte volbu -p (proces) a zadejte ID procesu jako parametr.

sudo lsof - p 4610

Zobrazí se vám seznam všech souborů, které byly otevřeny pomocí ID procesu, které zadáte.

Výpis ID procesů, které otevřely soubor

Chcete-li zobrazit ID procesů pro procesy, které otevřely konkrétní soubor, použijte volbu -t (stručné) a zadejte název souboru na příkazovém řádku.

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

ID procesů se zobrazí v jednoduchém seznamu.

Použijte AND a OR hledání

Uveďme seznam souborů, které byly otevřeny uživatelem Mary a které souvisejí s procesy SSH. Víme, že na příkazovém řádku můžeme poskytnout více než jednu položku hledání, takže by to mělo být snadné.

sudo lsof -u mary -c ssh

Nyní se podívejme na výstup z lsof. To nevypadá správně; ve výstupu jsou položky, které spustil root.

To není to, co jsme očekávali. Co se stalo?

  Jak zabít procesy z linuxového terminálu

Pokud zadáte více hledaných výrazů, lsof vrátí jakýkoli soubor, který odpovídá prvnímu hledanému výrazu nebo druhému hledanému výrazu a tak dále. Jinými slovy, provádí vyhledávání OR.

Chcete-li, aby lsof prováděl hledání AND, použijte volbu -a (and). To znamená, že v seznamu budou uvedeny pouze soubory, které odpovídají prvnímu hledanému výrazu, druhému hledanému výrazu a tak dále.

Zkusme to znovu a použijte volbu -a.

sudo lsof -u mary -c ssh -a

Nyní je každý soubor ve výpisu ten, který byl otevřen Mary nebo jejím jménem a je spojen s příkazem SSH.

Automatické obnovování displeje

Můžeme použít volbu +|-r (repeat), abychom uvedli lsof do režimu opakování. Možnost opakování lze použít dvěma způsoby, buď +r nebo -r. Musíme také přidat počet sekund, které chceme, aby lsof čekal před obnovením zobrazení.

Použití volby opakování v obou formátech způsobí, že lsof zobrazí výsledky jako obvykle, ale přidá přerušovanou čáru do spodní části displeje. Čeká na počet sekund zadaný na příkazovém řádku a poté obnoví zobrazení novou sadou výsledků.

S volbou -r to bude pokračovat, dokud nestisknete Ctrl+C. S formátem +r bude pokračovat, dokud nebudou k dispozici žádné výsledky nebo dokud nestisknete Ctrl+C.

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

Všimněte si přerušované čáry ve spodní části výpisu. To odděluje každé nové zobrazení dat při aktualizaci výstupu.

Zobrazení souborů spojených s připojením k Internetu

Volba -i (internet) vám umožňuje zobrazit soubory otevřené procesy souvisejícími se síťovým a internetovým připojením.

lsof -i

Zobrazí se všechny soubory otevřené síťovým a internetovým připojením.

Zobrazení souborů spojených s internetovým připojením podle ID procesu

Chcete-li zobrazit soubory otevřené internetovými připojeními, které jsou spojeny s konkrétním ID procesu, přidejte volbu -p a volbu -a.

Zde hledáme soubory otevřené pomocí internetu nebo síťového připojení, procesem s ID 606.

sudo lsof -i -a -p 606

Zobrazí se všechny soubory otevřené procesem ID 606, které jsou spojeny s internetovým nebo síťovým připojením.

Zobrazení souborů spojených s internetovými připojeními a příkazy

K vyhledání souborů otevřených konkrétními procesy můžeme použít volbu -c (příkaz). Chcete-li vyhledat soubory, které byly otevřeny pomocí internetu nebo síťových připojení spojených s procesem ssh, použijte následující příkaz:

lsof -i -a -c ssh

Všechny soubory otevřené v důsledku procesů ssh jsou uvedeny ve výstupu.

Zobrazení souborů spojených s internetovými připojeními a porty

Můžeme vytvořit lsof zprávu o souborech, které byly otevřeny pomocí internetu nebo síťových připojení na konkrétním portu. K tomu použijeme znak : následovaný číslem portu.

Zde žádáme lsof, aby vypsal soubory, které byly otevřeny síťovým nebo internetovým připojením pomocí portu 22.

lsof -i :22

Všechny uvedené soubory byly otevřeny procesy spojenými s portem 22 (což je výchozí port pro připojení SSH).

Zobrazení souborů spojených s internetovými připojeními a protokoly

Můžeme požádat lsof, aby ukázal soubory, které byly otevřeny procesy spojenými se síťovým a internetovým připojením, které používají specifický protokol. Můžeme si vybrat z TCP, UDP a SMTP. Použijme protokol TCP a uvidíme, co dostaneme.

sudo lsof -i tcp

V seznamu jsou uvedeny pouze soubory otevřené procesy, které používají protokol TCP.

Pouze jsme poškrábali povrch

To je dobrý základ v některých běžných případech použití pro lsof, ale je toho mnohem víc. O co víc lze soudit podle skutečnosti, že manuálová stránka má více než 2 800 řádků.

Příkaz lsof lze použít ke stále hlubšímu pronikání do vrstev otevřených souborů a pseudosouborů. Poskytli jsme náčrt mapy; atlas je v manuálová stránka.