lsof znamená Seznam otevřených souborů.
Příkaz lsof si snadno zapamatujete, pokud si jej představíte jako „ls + of“, kde ls znamená seznam a of znamená otevřené soubory.
Je to nástroj příkazového řádku, který se používá k výpisu informací o souborech, které jsou otevřeny různými procesy. V unixu je vše soubor (roury, zásuvky, adresáře, zařízení atd.). Takže pomocí lsof můžete získat informace o všech otevřených souborech.
1. Úvod do lsof
Jednoduchým zadáním lsof získáte seznam všech otevřených souborů patřících všem aktivním procesům.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root 0u CHR 1,3 0t0 4369 /dev/null init 1 root 1u CHR 1,3 0t0 4369 /dev/null init 1 root 2u CHR 1,3 0t0 4369 /dev/null init 1 root 3r FIFO 0,8 0t0 6323 pipe ...
Ve výchozím nastavení je zobrazen jeden soubor na řádek. Většina sloupců je samovysvětlující. Vysvětlíme podrobnosti o několika kryptických sloupcích (FD a TYPE).
FD – Představuje deskriptor souboru. Některé hodnoty FD jsou,
- cwd – aktuální pracovní adresář
- txt – textový soubor
- mem – soubor mapovaný v paměti
- mmap – zařízení s mapou paměti
- ČÍSLO – Představuje skutečný deskriptor souboru. Znak za číslem, tj. ‚1u‘, představuje režim, ve kterém je soubor otevřen. r pro čtení, w pro zápis, u pro čtení a zápis.
TYPE – Určuje typ souboru. Některé z hodnot TYPEs jsou,
- REG – běžný soubor
- DIR – Adresář
- FIFO – First In First Out
- CHR – speciální soubor znaků
Úplný seznam FD &TYPE naleznete v man lsof.
2. Seznam procesů, které otevřely konkrétní soubor
Můžete uvést pouze procesy, které otevřely konkrétní soubor, zadáním názvu souboru jako argumentů.
# lsof /var/log/syslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
3. Seznam otevřených souborů v adresáři
Pomocí možnosti „+D“ můžete vypsat procesy, které otevřely soubory v zadaném adresáři. +D bude také opakovat podadresáře. Pokud nechcete, aby se lsof opakoval, použijte volbu „+d“.
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
4. Seznam otevřených souborů na základě názvů procesů začínajících na
Soubory otevřené podle názvů procesů začínajících řetězcem můžete vypsat pomocí volby „-c“. -c následovaný názvem procesu zobrazí seznam souborů otevřených procesem počínaje tímto názvem procesu. Na jednom příkazovém řádku můžete zadat více přepínačů -c.
# lsof -c ssh -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so ... ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
5. Seznam procesů pomocí přípojného bodu
Někdy, když se pokusíme odpojit adresář, systém oznámí chybu „Zařízení nebo zdroj je zaneprázdněn“. Musíme tedy zjistit, jaké jsou všechny procesy používající bod připojení, a tyto procesy zabít, abychom odpojili adresář. Pomocí lsof můžeme tyto procesy najít.
# lsof /home
Následující bude také fungovat.
# lsof +D /home/
6. Seznam souborů otevřených konkrétním uživatelem
Chcete-li najít seznam souborů otevřených konkrétními uživateli, použijte volbu „-u“.
# lsof -u lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
Někdy možná budete chtít vypsat soubory otevřené všemi uživateli, očekávejte nějaký 1 nebo 2. V takovém případě můžete pomocí znaku „^“ vyloučit pouze konkrétního uživatele následovně
# lsof -u ^lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode udisks-da 1584 root cwd DIR 8,1 4096 2 /
Výše uvedený příkaz vypsal všechny soubory otevřené všemi uživateli, očekávejte uživatele ‚lakshmanan‘.
7. Seznam všech otevřených souborů podle konkrétního procesu
Pomocí volby „-p“ můžete vypsat všechny soubory otevřené konkrétním procesem. Někdy bude užitečné získat více informací o konkrétním procesu.
# lsof -p 1753 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt bash 1753 lakshmanan rtd DIR 8,1 4096 2 / bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0 ...
8. Zabijte všechny procesy, které patří konkrétnímu uživateli
Pokud chcete zabít všechny procesy, které mají soubory otevřené konkrétním uživatelem, můžete použít volbu „-t“ k vypsání výstupu pouze id procesu a předat jej k ukončení následovně
# kill -9 `lsof -t -u lakshmanan`
Výše uvedený příkaz ukončí všechny procesy patřící uživateli ‚lakshmanan‘, který má otevřené soubory.
Podobně můžete také použít „-t“ mnoha způsoby. Například vypsat ID procesu procesu, který otevřel /var/log/syslog, lze provést pomocí
# lsof -t /var/log/syslog 489
Když mluvíme o zabíjení, věděli jste, že existují 4 způsoby, jak zabít proces?
9. Kombinujte více možností seznamu pomocí OR/AND
Ve výchozím nastavení, když použijete více než jednu možnost seznamu v lsof, budou označeny NEBO. Například,
# lsof -u lakshmanan -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2 bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2 ...
Výše uvedený příkaz používá dvě možnosti seznamu, „-u“ a „-c“. Příkaz tedy vypíše proces patřící uživateli ‚lakshmanan‘ a název procesu začíná ‚init‘.
Pokud ale chcete uvést, že proces patří uživateli ‚lakshmanan‘ a název procesu začíná ‚init‘, můžete použít volbu ‚-a‘.
# lsof -u lakshmanan -c init -a
Výše uvedený příkaz nevypíše nic, protože žádný takový proces s názvem „init“ patřící uživateli „lakshmanan“ neexistuje.
10. Proveďte lsof v režimu opakování
lsof také podporuje režim opakování. Nejprve vypíše soubory na základě daných parametrů a zpozdí zadané sekundy a znovu zobrazí soubory na základě daných parametrů. Může být přerušeno signálem.
Režim opakování lze aktivovat pomocí „-r“ nebo „+r“. Pokud se použije „+r“, režim opakování se ukončí, když nebudou nalezeny žádné otevřené soubory. „-r“ bude pokračovat ve vypisování, zpoždění, vypisování, dokud nedojde k přerušení bez ohledu na to, zda jsou soubory otevřeny nebo ne.
Každý výstup cyklu bude oddělen pomocí „=======“. Můžete také zadat časové zpoždění jako „-r“ | „+r“.
# lsof -u lakshmanan -c init -a -r5 ======= ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 / inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh =======
Ve výše uvedeném výstupu není po dobu prvních 5 sekund žádný výstup. Poté se spustí skript s názvem „inita.sh“ a zobrazí výstup.
Hledání síťového připojení
Síťová připojení jsou také soubory. Informace o nich tedy můžeme najít pomocí lsof.
11. Vypsat všechna síťová připojení
Můžete vypsat všechna otevřená síťová připojení pomocí volby „-i“.
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060 cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
Můžete také použít „-i4“ nebo „-i6“ pro uvedení pouze „IPV4“ nebo „IPV6“.
12. Seznam všech síťových souborů používaných konkrétním procesem
Všechny síťové soubory, které proces používá, můžete vypsat následovně
# lsof -i -a -p 234
Můžete také použít následující
# lsof -i -a -c ssh
Výše uvedený příkaz zobrazí seznam síťových souborů otevřených procesy začínajícími na ssh.
13. Seznam procesů, které naslouchají na konkrétním portu
Procesy, které naslouchají na konkrétním portu, můžete vypsat pomocí „-i“ s „:“ následovně
# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)
14. Seznam všech připojení TCP nebo UDP
Všechna připojení TCP nebo UDP můžete vypsat zadáním protokolu pomocí „-i“.
# lsof -i tcp; lsof -i udp;
15. Vypsat všechny soubory systému souborů NFS (Network File System)
Všechny soubory NFS můžete vypsat pomocí možnosti „-N“. Následující příkaz lsof zobrazí seznam všech souborů NFS používaných uživatelem ‚lakshmanan‘.
# lsof -N -u lakshmanan -a