GNU/Linux >> Znalost Linux >  >> Linux

15 příkladů příkazů Linux lsof (Identifikace otevřených souborů)

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

Linux
  1. Linux ls Command - Seznam souborů

  2. 7 Příklady příkazů Linux df

  3. 8 Příklady příkazů Linux TR

  1. Příklady příkazů rm v Linuxu

  2. Příklady příkazů ps v Linuxu

  3. w Příklady příkazů v Linuxu

  1. 7 Příklady příkazu lsof v Linuxu

  2. Praktické příklady příkazu rsync v Linuxu

  3. sa Příklady příkazů v Linuxu