Příkaz lsof uvádí otevřené soubory, sokety a kanály. Pomocí příkazu lsof můžete zjistit, jaké soubory jsou udržovány otevřené (jako jsou knihovny nebo soubory protokolu) a jaké porty démoni poslouchají. Otevřené soubory můžete vyhledat pomocí příkazu lsof. lsof by měl být spuštěn jako superuživatel (root), aby viděl všechny otevřené soubory. Při použití bez jakýchkoli argumentů/voleb lsof vypíše všechny otevřené soubory pro aktuální aktivní procesy.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 4587561 /sbin/init (deleted) init 1 root DEL REG 253,0 4849693 /lib64/libnss_files-2.12.so ..........
Pochopení výstupu příkazu „lsof“:
COMMAND: Command using the file. PID: PID of the file USER: Owner of the file FD: File descriptor. Different flags of File descriptor are as below: # : The number in front of flag(s) is the file descriptor number used by the process to associate with the file u : File open with Read and Write permission r : File open with Read permission w : File open with Write permission W : File open with Write permission and with Write Lock on entire file mem : Memory mapped file, usually for shared library TYPE: File type. Different flags of File type are as below: REG - Regular file DIR - Directory DEVICE: major, minor number of the device where file resides. SIZE/OFF: File size NODE: inode number NAME: File name
Najděte otevřené soubory pod bodem připojení
Otevřené soubory v konkrétním adresáři lze najít pomocí lsof. Například otevřete textový soubor (nezavírejte jej – nechte jej otevřený) v adresáři pro úpravy pomocí vi a zkontrolujte výstup lsof v tomto adresáři v jiné relaci.
# cd /test # vi a.txt
V jiné relaci zkontrolujte výstup lsof v tomto adresáři:
# lsof /test COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2972 root cwd DIR 253,0 4096 262145 /test vi 3012 root cwd DIR 253,0 4096 262145 /test
To lze také použít k odpojení zaneprázdněného přípojného bodu. Procesy udržující přípojný bod zaneprázdněný lze nalézt pomocí lsof.
Vyhledání informací o konkrétním procesu
Pro více informací o konkrétním procesu použijte volbu -p pro lsof:
# lsof -p 8797
Zobrazit adresy pro poslech
Démoni se mohou buď vázat na globální adresu IPv4 0.0.0.0, nebo na konkrétní adresy, jako je 127.0.0.1 (localhost). Démon vázaný na adresu localhost bude dostupný pouze ze samotného systému. Pomocí voleb -i a -nP pro lsof zobrazíte naslouchající porty bez hledání názvů hostitelů a služeb. Následující příklad ukazuje démona Apache httpd běžícího na localhost na nestandardním portu 7777. Ostatní systémy se nebudou moci připojit k tomuto httpd procesům:dobré pro zabezpečení, špatné pro vzdálené připojení.
Příklad:
# lsof -i -nP | grep httpd httpd 8616 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8614 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8623 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)
Příklad:
Naproti tomu následující proces OpenSSH sshd bude přijímat připojení z jiných systémů, protože je vázán na adresu 0.0.0.0, jak je označeno * před číslem portu.
# lsof -i -P | grep sshd sshd 4341 root 3u IPv4 46438 TCP *:22 (LISTEN)
Některé aplikace naslouchají na mnoha různých portech, jako je Berkeley Internet Name Daemon (BIND) s názvem démon, verze 9.
Příklad:
# lsof -i -nP | grep ^named named 9865 named 5u IPv6 0x03348be0 0t0 UDP *:53 named 9865 named 6u IPv6 0x0566re80 0t0 TCP *:53 (LISTEN) named 9865 named 7u IPv4 0x03456b10 0t0 UDP 127.0.0.1:53 named 9865 named 8u IPv4 0x01870570 0t0 TCP 127.0.0.1:53 (LISTEN) named 9865 named 9u IPv4 0x03456a40 0t0 UDP *:49164 named 9865 named 10u IPv6 0x03456970 0t0 UDP *:49165 named 8888 named 11u IPv4 0x0186fd54 0t0 TCP *:953 (LISTEN) named 8888 named 13u IPv4 0x01387ee0 0t0 UDP 168.1.863.1:67 named 8888 named 14u IPv4 0x099899ce4 0t0 TCP 168.1.863.1:67(LISTEN)
Najít soubory otevřené procesem
Proces nemusí fungovat z jiných důvodů, jako je brána firewall, řízení přístupových služeb, jako je tcp_wrappers, nebo jiná nesprávná konfigurace. Použijte ping, telnet nebo nmap ke kontrole ze vzdáleného systému, zda požadavek nemůže blokovat něco jiného, nebo spusťte tcpdump, abyste zjistili, zda připojení opouštějí zdroj nebo přicházejí do cílového systému.
Příklad
Chcete-li vidět, jaké soubory otevírají procesy, jejichž názvy začínají na „t“ (telnetd…) a bash. A chcete-li zjistit, jaké soubory otevírá init, použijte následující příkazy:
# lsof -c t # lsof -c bash # lsof -c init
Příklad
Chcete-li zjistit, jaké soubory otevírají procesy, jejichž názvy začínají „testuser“, ale vylučují ty, jejichž vlastníkem je uživatel „tom“, použijte následující příkaz:
# lsof -c testuser -u ^tom
Najděte procesy otevřené uživateli
Chcete-li zjistit, jaké procesy otevírají uživatelé myuser a tom, použijte následující příkaz:
# lsof -u myuser,tom
Hledání portu používaného procesem
Chcete-li zjistit, jaké procesy používají konkrétní port, použijte následující příkaz:
# lsof -i TCP:389
Jak zjistit počet otevřených souborů pro název procesu a pid procesu seřazené podle počtu otevřených souborů?
To může být zajímavé, když se objeví chyba „příliš mnoho otevřených souborů“. Použijte níže uvedený skript, který využívá příkaz lsof:
# lsof | perl -lane '$x{"$F[0]:$F[1]"}++;END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Najděte procesy pomocí maximálních deskriptorů souborů
Limity deskriptorů souborů lze nastavit pomocí následujícího příkazu pro shell:
# ulimit -n 65536
Pomocí příkazu „lsof“ vyhledejte, co v systému používá popisy souborů.
# lsof -g | awk '{print $2}' | sort -u > /tmp/lsof_sort.txt
# for var in `cat /tmp/lsof_sort.txt` do echo `echo "$var ---- "``grep -x $var /tmp/lsof.txt | wc -l` done
Zobrazí se seznam všech procesů a odpovídající počet jimi otevřených souborů. Můžete si vybrat procesy, které mají nejvíce otevřených souborů, a podívat se, jaké to jsou.