Myslím, že v určitém okamžiku jste přemýšleli, zda existuje způsob, jak zobrazit otevřené soubory procesem nebo uživatelem. Dobrá věc je, že odpověď na tuto otázku je příkaz lsof.
Pravděpodobně už víte, že příkaz ls je zkratka pro „list“. lsof znamená ‚List Open Files‘. A přesně to dělá, vypisuje otevřené soubory podle procesů, uživatelů a ID procesů.
Dovolte mi, abych vám ukázal některé z nejběžnějších použití příkazu lsof.
příklady příkazů ls
Pokud použijete příkaz lsof bez jakýchkoli voleb a argumentů, zobrazí seznam všech otevřených souborů všemi procesy v systému.
lsof
Výstup by měl být takto:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
Výstup je většinou samozřejmý, ale přesto vás mohou zajímat sloupce FD a TYPE.
FD znamená deskriptor souboru. Některé z běžných hodnot pro FD jsou:
- cwd – aktuální pracovní adresář
- txt – textové soubory
- mem – soubor mapovaný v paměti
- mmap – zařízení s mapou paměti
- ČÍSLO – Skutečný deskriptor souboru. Má také informace o tom, ve kterém oprávnění k souboru je otevřen.
TYPE je prosté. Určuje typ souboru. Zde je několik příkladů:
- REG – běžný soubor
- DIR – Adresář
- CHR – speciální soubor znaků
- FIFO – First In First Out
Věř mi. Nechtěli byste spouštět příkaz lsof bez jakýchkoli argumentů.
proč to říkám? Protože to začne zaplavovat vaši obrazovku tisíci výsledků.
Pokud spustím příkaz lsof na serveru Ubuntu a spočítám počet řádků pomocí příkazu wc, zde je výsledek.
lsof | wc -l
11432
Ano! To je správně. Existuje více než jedenáct tisíc souborů otevřených různými procesy v systému.
nebojte se. Příkaz lsof je velmi užitečný při ladění, protože můžete vidět, jaké procesy otevírají jaké soubory a který soubor otevírá který proces.
Pokud nejste přihlášeni jako root, výstup příkazu lsof by byl velmi omezený. Pokud jste přihlášeni jako uživatel bez oprávnění root, je dobré použít sudo.
1. Vypište všechny procesy, které otevřely soubor
To je jednoduché. Stačí zadat cestu k souboru.
lsof <path_to_file>
2. Seznam všech souborů otevřených uživatelem
To se hodí v prostředí pro více uživatelů. Všechny soubory otevřené určitým uživatelem můžete vypsat následujícím způsobem:
lsof -u <user_name>
Můžete také zadat více než jednoho uživatele takto:
lsof -u user1, user2
nebo takto:
lsof -u user1 -u user2
3. Seznam všech otevřených souborů v adresáři
Pokud vás zajímá, které soubory byly otevřeny v určitém adresáři, můžete použít příkaz lsof s volbou +D.
lsof +D <path_to_directory>
Vyhledávání je rekurzivní. Vypíše tedy všechny otevřené soubory ve zmíněném adresáři a všechny jeho podadresáře.
4. Seznam všech otevřených souborů podle procesu
V tomto případě musíte znát ID procesu (pid). Pokud znáte ID procesu, můžete použít volbu -p příkazu lsof k nalezení souborů, které tento proces otevřel.
lsof -p <pid>
Můžete také zadat více ID procesů.
lsof -p pid1, pid2, pid3
5. Seznam všech souborů otevřených příkazem
To je zvláště užitečné při ladění. Předpokládejme, že chcete vidět, jaké soubory používá http démon, stačí zadat název příkazu (v našem příkladu httpd).
lsof -c <command>
6. Najít otevřené uživatelem a příkazem nebo procesem
Volby jako uživatel a příkaz a proces můžete kombinovat pomocí volby –a. Představte si to jako operátor AND. Získáte tak další filtr a pokusíte se zúžit vyhledávání.
lsof -a -u user_name -c command_name
7. Seznam síťových připojení a portů pomocí příkazu lsof
Příkaz lsof můžete také použít k nalezení otevřených portů nebo k nalezení procesu, který port používá.
Všechny druhy otevřených portů můžete uložit pomocí volby -i:
lsof -i
Výstup může vypadat takto:
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
Můžete také určit typ síťového připojení. Chcete-li například zobrazit seznam všech otevřených portů TCP, můžete použít:
lsof -i tcp
Chcete-li zjistit, který proces používá konkrétní port, můžete zadat číslo portu:
lsof -i :<port_number>
Bonusový tip:Použití operátoru negace s lsof
Operátor negace můžete použít k vyloučení uživatele nebo procesu při použití příkazu lsof.
Chcete-li například zobrazit seznam všech souborů, které otevřel jiný uživatel než root, použijte tento způsob:
lsof -u ^root
Příkaz lsof se stane ještě užitečnějším, když jej použijete s příkazem grep.
Doufám, že jste se v tomto článku dozvěděli něco nového. Pokud máte dotazy nebo návrhy, zanechte prosím níže komentář.