2021-12-18 08:37 Doba čtení: 20 min

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

Pokud se v Linuxu se vším zachází jako se souborem, pak musí existovat mnohem více věcí než jen soubory uložené na vašem pevném disku. Tento návod vám ukáže, jak využít příkaz `lsof` k prozkoumání všech ostatních zařízení a procesů, které jsou v systému Linux reprezentovány jako soubory.

Vše v Linuxu je považováno za soubor

Často opakované tvrzení, že v Linuxu je vše soubor, je v podstatě pravdivé. Soubor je v podstatě kolekce datových bajtů. Když je taková kolekce načtena do programu, nebo odeslána k tisku, generuje tok bajtů. Podobně, když se do souboru zapisuje, přijímá se tok bajtů.

Existuje mnoho dalších systémových komponent, které rovněž přijímají nebo vytvářejí toky bajtů, například klávesnice, síťová spojení (sockety), tiskárny a komunikující procesy. Protože tyto komponenty buď přijímají, generují, anebo kombinují obě tyto operace s toky bajtů, můžeme s nimi na velmi základní úrovni zacházet jako se soubory.

Tento koncepční přístup zjednodušil vývoj operačního systému Unix. Umožnil vytvoření malé sady obslužných rutin, nástrojů a aplikačních rozhraní (API) schopných pracovat s širokou škálou rozmanitých zdrojů.

Běžné datové soubory a programy, které se nacházejí na pevném disku, jsou standardní soubory v systému souborů. Pomocí příkazu `ls` je můžeme zobrazit a získat o nich základní informace.

Jakým způsobem se ale můžeme seznámit se všemi ostatními procesy a zařízeními, s nimiž se systém chová jako se soubory? K tomu použijeme příkaz `lsof`. Tento příkaz zobrazuje seznam všech otevřených souborů v systému, což znamená, že ukazuje vše, s čím se v jádru systému manipuluje jako se soubory.

Použití příkazu lsof

Mnoho procesů nebo zařízení, o nichž `lsof` podává informace, běží pod uživatelem root, nebo byly spuštěny s právy roota, takže pro spuštění příkazu `lsof` budete pravděpodobně muset použít `sudo`.

Vzhledem k tomu, že výstup tohoto příkazu může být velice rozsáhlý, doporučuje se ho zpracovat pomocí programu `less` pro pohodlné prohlížení.

sudo lsof | less

Před samotným zobrazením výstupu příkazu `lsof` se uživatelům grafického prostředí GNOME může v 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.

Příkaz `lsof` se pokouší zpracovat všechny připojené souborové systémy. Tato varovná zpráva se objevuje, protože `lsof` narazil na virtuální souborový systém GNOME (GVFS). Jedná se o specifický případ souborového systému v uživatelském prostoru (FUSE). FUNGUE jako most mezi grafickým prostředím GNOME, jeho API a samotným jádrem. Kromě uživatele, který jej připojil (v tomto případě GNOME), nemá k tomuto souborovému systému přístup nikdo – ani uživatel root. Toto varování můžete bez obav ignorovat.

Výstup z příkazu `lsof` je poměrně široký. Zcela vlevo se nacházejí tyto sloupce:

Sloupce, které jsou úplně vpravo, jsou následující:

Význam sloupců v lsof

Ne všechny sloupce jsou relevantní pro každý typ otevřeného souboru. Je tedy běžné, že některé z nich zůstanou prázdné.

Příkaz: Název příkazu spojeného s procesem, který otevřel daný soubor.
PID: Identifikační číslo procesu (Process ID), který soubor otevřel.
TID: Identifikační číslo úkolu (vlákna). Prázdný sloupec značí, že se nejedná o vlákno, ale o samostatný proces.
Uživatel: ID nebo jméno uživatele, pod kterým proces běží, nebo ID/přihlašovací jméno vlastníka adresáře v `/proc`, kde `lsof` získává informace o procesu.
FD: Zobrazuje deskriptor souboru. Detaily o deskriptorech souborů jsou popsány níže.
Typ: Typ uzlu spojeného se souborem. Podrobnosti k jednotlivým typům jsou uvedeny dále.
Zařízení: Obsahuje buď čísla zařízení (oddělená čárkami) pro speciální znakové, blokové, standardní soubory nebo adresáře, případně soubory NFS, nebo paměťovou adresu v jádru, která daný soubor identifikuje. Může také zobrazovat základní adresu nebo název zařízení pro socket Linux AX.25.
Size/Off: Zobrazuje velikost souboru, nebo aktuální posun v rámci souboru, udávané v bajtech.
Uzel: Zobrazuje číslo uzlu (inode) lokálního souboru nebo číslo inodu souboru NFS na serveru, případně typ internetového protokolu. Může zobrazovat `STR` pro stream, číslo IRQ, nebo inode pro socket Linux AX.25.
Název: Zobrazuje název bodu připojení a souborového systému, ve kterém je soubor umístěn.

Sloupec FD

Deskriptor souboru v sloupci `FD` může nabývat mnoha hodnot. Podrobnosti najdete v manuálové stránce. Záznam ve sloupci `FD` se skládá ze tří částí: deskriptor souboru, znak módu a znak zámku. Některé běžné deskriptory souborů jsou:

cwd: Aktuální pracovní adresář.
err: Informace o chybě pro daný deskriptor (viz sloupec `NAME`).
ltx: Text sdílené knihovny (kód a data).
m86: Mapovaný soubor DOS Merge.
mem: Soubor mapovaný v paměti.
mmap: Zařízení mapované do paměti.
pd: Nadřazený adresář.
rtd: Kořenový adresář.
txt: Text programu (kód a data).
Číslo reprezentující deskriptor souboru.

Znak módu (režimu přístupu) může být jeden z následujících:

r: Přístup pro čtení.
w: Přístup pro zápis.
u: Přístup pro čtení i zápis.
' ': Mezera, pokud je režim neznámý a není přítomen žádný znak zámku.
–: Režim je neznámý, ale je přítomen znak zámku.

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

r: Zámek pro čtení části souboru.
R: Zámek pro čtení celého souboru.
w: Zámek pro zápis části souboru.
W: Zámek pro zápis celého souboru.
u: Zámek pro čtení i zápis libovolné délky.
U: Neznámý typ zámku.
' ': Mezera. Žádný zámek.

Sloupec TYPE

Existuje více než 70 různých záznamů, které se mohou objevit ve sloupci `TYPE`. Některé běžné položky, se kterými se můžete setkat, jsou:

REG: Běžný soubor v souborovém systému.
DIR: Adresář.
FIFO: Fronta "First In, First Out" (první dovnitř, první ven).
CHR: Speciální znakový soubor.
BLK: Speciální blokový soubor.
INET: Internetový socket.
unix: UNIX doménový socket.

Zobrazení procesů, které otevřely soubor

Chcete-li zjistit, které procesy otevřely konkrétní soubor, zadejte jeho název jako parametr příkazu `lsof`. Například, chcete-li zjistit, které procesy mají otevřený soubor `kern.log`, použijte tento příkaz:

sudo lsof /var/log/kern.log

Příkaz `lsof` odpoví zobrazením jediného procesu, `rsyslogd`, který je spuštěn pod uživatelem `syslog`.

Zobrazení všech souborů otevřených z adresáře

Pro zobrazení souborů, které jsou otevřené v daném adresáři, včetně procesů, které je otevřely, zadejte adresář jako parametr příkazu `lsof`. Je nutné použít volbu `+D` (adresář).

Pokud chcete například zobrazit všechny soubory otevřené v adresáři `/var/log/`, použijte následující příkaz:

sudo lsof +D /var/log/

`lsof` zobrazí seznam všech otevřených souborů v daném adresáři.

Pro zobrazení všech souborů, 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 v adresáři `/home`. Všimněte si, že díky kratším popisům některých sloupců je celý výstup 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 si, že do příkazu `lsof` můžete zadat více než jeden hledaný výraz.

sudo lsof -c ssh -c init

Příkaz `lsof` zobrazí seznam souborů, které byly otevřeny některým z procesů zadaných v příkazovém řádku.

Zobrazení souborů otevřených uživatelem

Chcete-li omezit výpis pouze na soubory, které otevřel konkrétní uživatel, použijte volbu `-u` (uživatel). V tomto příkladu se podíváme na soubory, které byly otevřeny procesy, jejichž vlastníkem je uživatelka "mary", nebo je spustila jejím jménem.

sudo lsof -u mary

Všechny zobrazené soubory byly otevřeny uživatelem "mary" nebo jeho jménem. To zahrnuje soubory, které byly otevřeny v grafickém prostředí nebo v důsledku přihlášení uživatelky "mary".

Vyloučení souborů otevřených uživatelem

Chcete-li vyloučit soubory, které otevřel určitý uživatel, použijte operátor `^`. Vyloučení uživatelů z výpisu usnadňuje hledání informací, které vás skutečně zajímají. Použijte volbu `-u` jako dříve a přidejte znak `^` na začátek uživatelského jména.

sudo lsof +D /home -u ^mary

Výpis pro adresář `/home` tentokrát nezahrnuje žádné soubory, které byly otevřeny uživatelkou "mary".

Zobrazení seznamu souborů otevřených procesem

Pro výpis souborů, 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 procesem s vámi zadaným ID.

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

Chcete-li zobrazit ID procesů, které otevřely určitý soubor, použijte volbu `-t` (stručné) a zadejte název souboru v příkazovém řádku.

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

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

Použití AND a OR hledání

Pojďme zobrazit seznam souborů, které otevřela uživatelka "mary" a které souvisí s procesy SSH. Víme, že můžeme v příkazovém řádku zadat 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íváme na výstup příkazu `lsof`. Nevypadá to správně; ve výstupu jsou položky, které spustil uživatel root.

To jsme neočekávali. Co se stalo?

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í typu OR (nebo).

Pokud chcete, aby `lsof` prováděl vyhledávání AND (a), použijte volbu `-a` (and). V takovém případě budou ve výpisu uvedeny pouze soubory, které odpovídají prvnímu hledanému výrazu **a zároveň** druhému hledanému výrazu, atd.

Zkusme to znovu a použijeme volbu `-a`.

sudo lsof -u mary -c ssh -a

Nyní je každý soubor ve výpisu buď otevřený uživatelkou "mary" nebo jejím jménem, a zároveň je spojen s příkazem SSH.

Automatické obnovování zobrazení

Můžeme použít volbu `+|-r` (repeat), abychom `lsof` přepnuli do režimu opakování. Tuto volbu lze použít dvěma způsoby, buď `+r` nebo `-r`. Musíme také přidat počet sekund, které má `lsof` vyčkat před aktualizací zobrazení.

Použití volby opakování v obou formátech způsobí, že `lsof` zobrazí výsledky jako obvykle, ale přidá do spodní části zobrazení přerušovanou čáru. Po uplynutí počtu sekund zadaných v příkazovém řádku aktualizuje zobrazení novou sadou výsledků.

S volbou `-r` bude aktualizace probíhat, dokud nestisknete Ctrl+C. S formátem `+r` bude aktualizace probíhat, dokud nejsou k dispozici žádné další 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. Odděluje každé nové zobrazení dat při aktualizaci výstupu.

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

Volba `-i` (internet) vám umožňuje zobrazit soubory otevřené procesy, které souvisejí 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 dle ID procesu

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

Zde hledáme soubory otevřené internetovým nebo síťovým připojením, které souvisí s procesem o ID 606.

sudo lsof -i -a -p 606

Zobrazí se všechny soubory otevřené procesem ID 606, které souvisí 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í internetových nebo síťových připojení, které souvisí 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 zobrazeny ve výstupu.

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

Můžeme `lsof` požádat o zobrazení souborů, které byly otevřeny internetovými nebo síťovými připojeními na konkrétním portu. K tomu použijeme znak `:` následovaný číslem portu.

V tomto případě žádáme `lsof`, aby vypsal soubory, které byly otevřeny síťovými nebo internetovými připojeními přes port 22.

lsof -i :22

Všechny uvedené soubory byly otevřeny procesy, které jsou spojeny 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 `lsof` požádat, aby ukázal soubory, které byly otevřeny procesy spojenými se síťovým nebo internetovým připojením, a které používají specifický protokol. Můžeme si vybrat z protokolů TCP, UDP a SMTP. Zkusíme použít protokol TCP a podíváme se, co dostaneme.

sudo lsof -i tcp

Ve výpisu se objeví pouze soubory otevřené procesy, které používají protokol TCP.

Pouze jsme seškrábli povrch

Tento popis nabízí dobrý základ pro běžné případy použití příkazu `lsof`, ale jeho možnosti jsou mnohem rozsáhlejší. To potvrzuje i fakt, že manuálová stránka k tomuto příkazu má více než 2800 řádků.

Příkaz `lsof` lze použít k hlubšímu pronikání do vrstev otevřených souborů a pseudosouborů. Nabídli jsme vám nástin mapy; celý atlas naleznete v manuálové stránce.

Jan Novák
Autor
Czechia

Redaktor zaměřený na Windows, produktivitu a cloudové nástroje.

Předchozí článek
Co je bezdrátová nabíječka s certifikací „Qi“?
Další článek
Jak najít UUID vašeho Macu, iPhonu a iPadu