você está aqui: Home  → Arquivo de Mensagens

lsof - List Open Files

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 24 de março de 2015

O comando lsof significa List Open Files, ou Liste Arquivos Abertos.

Quando invocado sem fornecer nenhum argumento, ele lista os processos em execução e os arquivos abertos por cada um deles:

$ lsof
COMMAND    PID  TID USER   FD TYPE DEVICE SIZE/OFF       NODE NAME
init         1      root  cwd  DIR    8,1     4096          2 /
init         1      root  rtd  DIR    8,1     4096          2 /
init         1      root  txt  REG    8,1   265848    2228296 /sbin/init
init         1      root  mem  REG    8,1    47712    1311733 /lib/x86_64-linux-gnu/libnss_files-2.19.so
init         1      root  mem  REG    8,1    47760    1311763 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
init         1      root  mem  REG    8,1    97296    1311713 /lib/x86_64-linux-gnu/libnsl-2.19.so
init         1      root  mem  REG    8,1    39824    1311743 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
init         1      root  mem  REG    8,1    14664    1311737 /lib/x86_64-linux-gnu/libdl-2.19.so
init         1      root  mem  REG    8,1   252032    1315213 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
...

Listei acima apenas as primeiras linhas, na verdade este comando gerará uma saída que pode chegar a até mesmo centenas de linhas.

Com o uso de diretivas, posso obter listagens mais específicas de diversas formas.

Por exemplo, para listar os programas que estão acessando o arquivo /var/log/syslog, eu emito o comando:

sudo lsof /var/log/syslog
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
rsyslogd 862 syslog    1w   REG    8,1    92150 1325148 /var/log/syslog

Posso também solicitar que sejam listados todos os programas acessando arquivos em um determinado diretório. Isto é feito fornecendo ao programa lsof a diretiva +D.

sudo lsof +D /var/log
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
smbd       730   root    2w   REG    8,1        0 1593591 /var/log/samba/log.smbd
smbd       730   root   34w   REG    8,1        0 1593591 /var/log/samba/log.smbd
rsyslogd   862 syslog    1w   REG    8,1    92150 1325148 /var/log/syslog
rsyslogd   862 syslog    2w   REG    8,1    35863 1310944 /var/log/kern.log
rsyslogd   862 syslog    4w   REG    8,1    15211 1321755 /var/log/auth.log
smbd       923   root    2w   REG    8,1        0 1593591 /var/log/samba/log.smbd
smbd       923   root   28w   REG    8,1        0 1593591 /var/log/samba/log.smbd
Xorg      1412   root    0w   REG    8,1    31850 1310898 /var/log/Xorg.0.log
Xorg      1412   root    2w   REG    8,1     2282 1574974 /var/log/mdm/:0.log
console-k 1431   root    7w   REG    8,1    16790 1575022 /var/log/ConsoleKit/history
nmbd      2708   root    2w   REG    8,1     1800 1593512 /var/log/samba/log.nmbd
nmbd      2708   root   26w   REG    8,1     1800 1593512 /var/log/samba/log.nmbd
cupsd     3003   root    4u   REG    8,1    92830 1593620 /var/log/cups/access_log
cupsd     3003   root    5u   REG    8,1        0 1593547 /var/log/cups/error_log
cupsd     3003   root    6u   REG    8,1        0 1575143 /var/log/cups/page_log

Para listar os arquivos abertos por um determinado usuário, basta emitir o comando:

 lsof +u queiroz

Ou então, para listar todos os comandos dos usuários, com exceção de um deles:

 lsof +u ^queiroz

Para listar todos os arquivos abertos por um determinado processo:

 lsof -p 730

Para matar todos os processos em uso por um determinado usuário:

 kill -9 `lsof -t -u queiroz`

A diretiva -t produz uma listagem simplificada, contendo apenas a identificação do processo.

$ lsof -t -u queiroz | head
1502
1781
1782
1854
1858

Da mesma forma, eu posso usar a diretiva -t para listar o PID (Process ID) dos processos acessando um determinado arquivo ou diretório.

$ lsof -t /var/log/syslog
862

ou

$ lsof -t +D /var/log
730
862
923
1412
1431
2708
3003

Fonte: 15 Linux lsof Command Examples (Identify Open Files)



Veja a relação completa dos artigos de Rubens Queiroz de Almeida