Como listar arquivos abertos para um processo no Linux

Guia para usar o comando 'lsof' para um processo

Se você é um usuário frequente de sistemas Linux ou Unix, certamente já deve ter ouvido a frase: “No Linux, tudo é um arquivo”. Isso pode ser categorizado como uma simplificação exagerada do conceito, mas prova ser muito útil para entender como funcionam os arquivos no sistema Linux.

Nem tudo que aparece no ambiente Linux precisa ser um arquivo. Às vezes, pode ser um processo, pode ser um arquivo especial que representa as informações de hardware, diretórios e outras coisas.

Este tutorial irá guiá-lo para encontrar todos os arquivos que estão abertos para um processo específico no Linux.

Introdução a lsof Comando

A beleza do sistema Linux é que você pode controlar e gerenciar todo o seu sistema através do terminal, desde que conheça bem os comandos. Uma vez que os comandos são conhecidos, todas as tarefas no terminal se tornam uma moleza.

lsof apoia 'Lista de arquivos abertos‘. Depois de conhecer a versão longa do comando, torna-se muito fácil entender e usar o comando de maneira produtiva.

O lsof comando exibe as listas de arquivos abertos, soquetes e canais. Você pode pesquisar facilmente os arquivos abertos usando este comando. Quando o lsof O comando é usado sem qualquer opção, ele exibe todos os arquivos abertos em relação aos processos ativos que estão sendo executados.

Observação: Certifique-se de usar sudo enquanto executa os comandos.

Usando o lsof Comando

Vamos estudar a saída do lsof comando em detalhes. Estude o seguinte comando.

sudo lsof | menos

Observação: Se executarmos diretamente o lsof comando, a saída será muito grande e pode criar confusão para prosseguir. Portanto, aqui eu usei lsof | menos comando para a conveniência do tutorial.

Saída:

gaurav @ ubuntu: ~ $ sudo lsof | menos COMANDO PID TID USUÁRIO FD TYPE DEVICE SIZE / OFF NOME DO NÓ kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root txt desconhecido / proc / 31 / exe netns 32 root cwd DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt desconhecido / proc / 32 / exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 33 root rtd DIR 8,8 4096 2 / rcu_tasks 33 root txt desconhecido / proc / 33 / exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kauditd 34 root txt desconhecido / proc / 34 / exe 

A seguir estão os atributos que são exibidos usando o lsof comando.

ParâmetroDescrição
ComandoMostra o nome do comando que abre o arquivo.
PIDNúmero do identificador de processo do processo que abre o arquivo.
TIDNúmero do identificador da linha. Pode ser um tópico ou um número de tarefa.
Do utilizadorID do usuário ou nome do usuário que é o proprietário do processo.
FDMostra o descritor de arquivo do arquivo.
ModeloTipo de nó associado ao arquivo.
DispositivoMostra os números dos dispositivos.
Tamanho / DesligadoMostra o tamanho do arquivo em bytes.
Mostra o número do inode do diretório ou do diretório pai.
NomeMostra o nome do sistema de arquivos onde o processo está localizado.

Listando os processos

Em primeiro lugar, é importante que você obtenha os processos em execução e seus respectivos IDs de processo. O Linux fornece vários comandos para listar os processos junto com seus atributos como PID, usuário, diretório, etc.

Você pode usar comandos como principal, ps, htop, pstree para listar os processos no terminal.

Ao longo do tutorial, usarei o principal comando para o fazer. O principal comando fornece uma visão dinâmica em tempo real de um sistema em execução. Ele também exibe todos os processos e threads atualmente sendo gerenciados pelo kernel do Linux. Estude o bloco fornecido abaixo para verificar a saída do principal comando.

Sintaxe:

sudo top

Saída:

gaurav @ ubuntu: ~ $ sudo top PID USUÁRIO PR NI VIRT RES SHR S% CPU% MEM TIME + COMANDO 2703 gaurav 20 0 4286124 1,142g 103584 R 88,2 30,5 87: 48,08 Web Content 1173 mongodb 20 0 288536 6776 3428 S 5,9 0,2 2: 34,41 mongod 13765 gaurav 20 0 2931568 131408 47496 S 5,9 3,3 1: 42,34 Conteúdo da web 1 root 20 0 225904 6824 4900 S 0,0 0,2 0: 27,25 systemd 2 root 20 0 0 0 0 S 0,0 0: 00,05 kthreadd 4 root 0 -20 0 0 0 I 0,0 0,0 0: 00,00 kworker / 0: 0H 6 root 0 -20 0 0 0 I 0,0 0,0 0: 00,00 mm_percpu_wq 7 root 20 0 0 0 0 S 0,0 0,0 0: 01,89 ksoftirqd / 0 8 root 20 0 0 0 0 I 0,0 0,0 0: 22,32 rcu_sched 9 root 20 0 0 0 0 I 0,0 0,0 0: 00,00 rcu_bh 10 root rt 0 0 0 0 S 0,0 0,0 0: 03,13 migração / 0 

No bloco acima, podemos ver todas as informações relacionadas ao processo em um só lugar. A partir daqui podemos encontrar o PID do processo do qual temos que exibir os arquivos abertos usando o lsof comando.

Mas se você quiser descobrir o ID do processo de apenas um processo específico e evitar outros processos indesejados, use o seguinte comando.

Sintaxe:

sudo top | grep [Process_Name]

Exemplo:

gaurav @ ubuntu: ~ $ top | grep terminal 13819 gaurav 20 0 803336 19728 9160 S 0,3 0,5 0: 53,63 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 1,0 0,5 0: 53,66 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 0,5 0: 53,67 gnome -terminal- gaurav @ ubuntu: ~ $

Aqui, exibimos especificamente o ID do processo do processo, que possui a string ‘terminal’ no nome do processo. Este método é útil quando você não tem conhecimento do nome completo do processo ou do PID.

Exibindo os arquivos abertos relacionados a um processo usando o PID

No bloco acima, aprendemos como obter as informações relacionadas ao processo com a ajuda do comando top. Agora vamos usar o PID correspondente a qualquer processo no sistema e tente exibir a lista dos arquivos abertos relacionados a esse processo usando o lsof comando.

Da saída fornecida acima, consideremos o processo correspondente ao PID 1173 que está destacado. Estaremos usando o lsof -p [PID] comando para o fazer.

Sintaxe:

sudo lsof -p [PID]

Este comando pega o PID do processo como entrada e lista todos os arquivos correspondentes a este PID.

Saída:

gaurav @ ubuntu: ~ $ sudo lsof -p 1173 lsof: AVISO: não é possível stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs As informações de saída podem estar incompletas. COMANDO PID USUÁRIO TIPO DE DISPOSITIVO TAMANHO / DESLIGADO NOME DO NÓ mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb txt REG 8,8 38379496 2885608 / usr / bin / mongod mongod mongod 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/x86_64-linux-gnu/libresolv-2.27.so mongodbod 1173 mongodb mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2 mongod 1173 mongodb 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 / usr / lib / locale / locale-archive mongod 1173 mongodb mem REG 8,8 2030544 2621501 / lib / x86_64-linux-gnu / libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 mongodb mem REG 8,8 96616 2624649 / lib / x86_64-linux-gnu / libgcc_s.so.1 mongod 1173 mongodb me m REG 8.8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8.8 14560 2621535 /lib/x86_64-linux-gnu/libdl-2.27.so mongod 1173 mongodb mem REG 8.8 14560 2621535 /lib/x86_64-linux-gnu/libdl-2.27.so mongod 1173 mongodb mem REG 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 gaurav @ ubuntu : ~ $

Os arquivos que estão abertos para o processo com o ID de processo 1713 são exibidos usando o lsof comando.

Observação: Os usuários do GNOME podem encontrar o aviso abaixo. Você pode ignorá-lo com segurança.

lsof: AVISO: não é possível stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs As informações de saída podem estar incompletas.

Listando arquivos abertos relacionados a um processo usando o nome do processo

O lsof O comando também oferece a opção de listar os arquivos abertos usando os nomes dos processos. Os nomes devem ser fornecidos ao comando como uma string de entrada. Veja a sintaxe abaixo para usar esta opção.

Sintaxe:

sudo lsof -c [Nome do processo]

Exemplo:

sudo lsof -c mysql

Saída:

gaurav @ ubuntu: ~ $ sudo lsof -c mysql lsof: AVISO: não é possível stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs As informações de saída podem estar incompletas. COMANDO PID USUÁRIO FD TYPE DEVICE SIZE / OFF NOME DO NÓ mysqld 1266 mysql cwd DIR 8,8 4096 3154135 / var / lib / mysql mysqld 1266 mysql rtd DIR 8,8 4096 2 / mysqld 1266 mysql txt REG 8,8 24691368 2889411 / usr / sbin / mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 / [aio] mysqld 1266 mysql DEL REG 0,18 28126 / [ aio] mysqld 1266 mysql DEL REG 0,18 28125 / [aio] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mysqld 1266 mysql mem REG 8,8 47576 2624592 / lib / x86_64-linux-gnu / libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so 

A saída será como aquela em que o ID do processo é usado em vez do nome do processo.

Listando arquivos abertos por conexões de rede

No Linux, os arquivos também podem ser na forma de informações sobre suas conexões de rede, conexões de hardware, etc. Podemos usar lsof comando para listar os arquivos abertos pela conexão de rede. Use o seguinte método.

sudo lsof -i

Saída:

gaurav @ ubuntu: ~ $ sudo lsof -i COMANDO PID USUÁRIO FD TYPE DEVICE SIZE / OFF NOME DO NÓ systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost: domínio systemd-r 969 systemd-resolve 13u IPv4 17358 0t0 localhost TCP: domínio (LISTEN) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu: 48090 -> _ gateway: domínio avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *: mdns avahi-dae 1028 avahi 13u IPv6 23811 0t0 UDP *: mdns avahi-dae 1028 avahi 14u IPv4 23812 0t0 UDP *: 58999 avahi-dae 1028 avahi 15u IPv6 23813 0t0 UDP *: 37512 mongod 1173 mongodb 6u IPv4 28149 0t0 TCP localhost0 TCP localhost: 27017 (LISTEN) mysqld 1266 TCP localhost 19u mysql (LISTEN) apache2 1283 root 4u IPv6 28140 0t0 TCP *: http (LISTEN) gaurav @ ubuntu: ~ $

Aqui podemos ver as informações sobre os arquivos que são abertos pela conexão de rede usando o lsof -i comando.

Conclusão

Neste tutorial simples, aprendemos como listar arquivos abertos para um processo no Linux usando vários métodos fáceis de usar. Para mais usos do lsof comando, veja o lsof página do manual.