...

Utilizar o lsof de forma eficaz: analisar ficheiros e processos abertos

Eu fixo lsof no Linux para ver, em segundos, qual o processo que mantém aberto um determinado ficheiro, socket ou porta. É assim que identifico registos bloqueados, ocupados Portos e resolvo, de forma direta e eficaz, os problemas relacionados com ficheiros bloqueados.

Pontos centrais

Para que a introdução seja bem-sucedida, vou resumir os pontos mais importantes Aspectos resumindo.

  • Recursos tornar visíveis: processos, ficheiros, diretórios, dispositivos, pipes, sockets.
  • Filtros utilizar: por nome do processo (-c), PID (-p), utilizador (-u), ficheiro, diretório (+d/+D), porta (-i).
  • Erro delimitar: localizar ficheiros bloqueados, resolver conflitos de portas, identificar serviços que ficaram bloqueados.
  • Rede verificar: identificar rapidamente ligações ativas e portas ocupadas.
  • Fluxo de trabalho simplificar: primeiro delimitar, depois analisar de forma específica e, por fim, agir.

Por que é que o lsof é importante no dia-a-dia

Eu uso lsof, quando um serviço não arranca, um ficheiro indica que está „ocupado“ ou uma porta já está ocupada. A ferramenta associa ficheiros, processos, utilizadores e a rede numa apresentação clara Ver. Consigo identificar imediatamente qual é o PID que está a bloquear o acesso e há quanto tempo. Assim, em vez de adivinhar, encerro o processo correto, em vez de parar acidentalmente o serviço errado. Especialmente em servidores de produção, ganho assim minutos a horas, porque identifico a causa diretamente no processo. Esta abordagem poupa tickets, reduz as falhas e cria um sistema robusto Conclusões.

Compreender a sintaxe básica e a saída

A forma básica é lsof [opções] e, sem parâmetros, apresenta todos os que estão atualmente abertos objetos. Em sistemas com elevada carga de trabalho, filtro a saída, em vez de ter de analisar milhares de linhas. É importante referir que, no Linux, o conceito de „ficheiro“ é abrangente: inclui diretórios, dispositivos, bibliotecas e rede-Soquetes. Na saída, colunas como COMMAND, PID, USER, FD, TYPE e NAME são úteis. Começo por analisar as colunas FD (descritor de ficheiro), TYPE (REG, DIR, IPv4/6) e NAME, com indicação do caminho ou da porta. Ao analisar estas colunas, é possível compreender rapidamente o estado atual do sistema e atribuir os recursos de forma organizada Processos.

Instalação e permissões na prática

Em muitas distribuições, está lsof não vem pré-instalado. Por isso, vou instalá-lo antecipadamente através do gestor de pacotes (apt install lsof, dnf install lsof, yum install lsof ou pacman -S lsof), para que esteja imediatamente disponível em caso de incidente. Para obter uma visão completa, costumo executar o lsof com sudo porque, sem direitos elevados, muitas entradas acabam por apresentar a mensagem „permission denied“ ou simplesmente não aparecem. Apesar disso, começo deliberadamente sem acesso root, verifico até onde consigo chegar e só elevo os direitos quando for necessário. Em sistemas com SELinux ou AppArmor, tenho em conta que os contextos de segurança podem limitar a visibilidade; dependendo da compilação, mostra lsof Adiciono contextos. Em consultas em massa, supresso os avisos com -w, para que os scripts continuem a ser robustos.

Ler campos e tipos FD de forma segura

A coluna FD é a minha chave para a compreensão. Os valores mais comuns são:

  • cwd: diretório de trabalho atual do processo.
  • txt: o ficheiro executável (segmento de texto) do processo.
  • mem: bibliotecas partilhadas carregadas e ficheiros mapeados (mapeamentos de memória).
  • 0h, 1s, 2s: Descritores padrão (stdin, stdout, stderr) com modo r (ler), w (escrever) ou u (leitura/gravação).
  • valores mais elevados, como 3u, 7r: descritores abertos normais, frequentemente ficheiros, sockets ou pipes.

De TIPO leio a classe do objeto: REG (ficheiro normal), DIR (Índice), CHR/BLK (dispositivo de desenho/bloco), FIFO (Tubo), IPv4/IPv6 (rede), UNIX (Socket de domínio Unix). Em NOME aparece o caminho ou, no caso dos sockets, o ponto final, por exemplo,. TCP *:80 (LISTEN) ou UDP 127.0.0.1:123. Quando eu (eliminado) No final, vejo que um ficheiro foi eliminado, mas ainda está a ser retido por um PID – uma razão típica para o espaço em disco „desaparecido“.

Filtrar de forma específica: ficheiros, diretórios, portas

Começo por definir o contexto e, em seguida, começo com um Filtros. Para um diretório, utilizo lsof +D /var/log (recursivo) ou lsof +d /var/log (apenas a própria pasta). Verifico os ficheiros individualmente, por exemplo, lsof /var/log/syslog, para ver os processos que estão a escrever. Para as portas, defino lsof -i:80, lsof -i:443 ou de forma genérica lsof -i um. Gosto de combinar isso com -nP, para que o lsof não resolva endereços IP e portas e funcione mais rapidamente. Desta forma, a partir de um estado do sistema confuso, obtém-se num curto espaço de tempo uma visão focada Imagem.

Combinar e refinar filtros

Para análises repetíveis, combino filtros com -a ligadas logicamente. Desta forma, obtenho apenas registos que cumpram todas as condições. Exemplos:

  • lsof -a -p 1234 -d cwd,txt,mem – apenas o diretório de trabalho, o ficheiro binário e as bibliotecas carregadas de um processo.
  • lsof -a -iTCP -sTCP:ESTABLISHED -p 1234 – apenas ligações TCP estabelecidas de um PID.
  • lsof -a -u www-data +d /var/www – Ficheiros na pasta /var/www que mantêm abertos processos do utilizador www-data.

Com -d filtro por descritores (números ou nomes como cwd, mem). -U Mostra-me especificamente os sockets de domínio Unix na saída quando quero investigar problemas de IPC local. Desta forma, reduzo o ruído e vejo exatamente o que é relevante para a questão.

Atribuir rapidamente processos e utilizadores

Se eu souber o nome de um serviço, o sistema fornece lsof -c nginx todos os ficheiros abertos do servidor Web, incluindo Bibliotecas, configurações e sockets. Para uma análise clara, trabalho frequentemente com o PID: lsof -p 1234 mostra todos os identificadores de um processo específico. As verificações relacionadas com o utilizador faço-as com lsof -u mysql ou outra conta, para tornar visíveis os recursos abertos de uma conta de serviço. Em análises mais extensas, complemento a visão do processo com Contabilidade de processos e vejo com que frequência e durante quanto tempo os programas utilizam recursos. Esta combinação de perspetivas de processo, utilizador e atividade permite-me chegar rapidamente à Causa.

Casos especiais: ficheiros eliminados, Logrotate e ficheiros que ocupam muito espaço

Quando „falta“ espaço no disco, muitas vezes descubro a causa com lsof +L1: Apresenta uma lista de ficheiros que já foram eliminados, mas que ainda se encontram abertos por processos. São típicos os registos rotacionados, ficheiros temporários de grande dimensão ou dumps de depuração. Em vez de aumentar a partição à pressa, encerro de forma seletiva os PIDs apresentados ou envio o sinal habitual para a recarga. Para serviços de registo, prefiro uma recarga completa do respetivo serviço, para que os descritores sejam reabertos. Soluções provisórias como truncate ou a remoção direta sem reiniciar o processo apenas adia o problema.

No caso de fluxos de dados longos, verifico também a coluna SIZE/OFF (visível dependendo da compilação), para verificar se um processo está ligado a um deslocamento muito grande. Isso explica por que razão um identificador ocupa tanto espaço de memória, apesar de o ficheiro estar marcado como eliminado.

Resolver sistematicamente cenários típicos de erros

Elimino os ficheiros bloqueados depois de lsof mostrou-me o processo responsável. Em vez de encerrar serviços de forma aleatória, encerro especificamente o PID ou reinicio exatamente esse serviço. Resolvo os conflitos de portas com lsof -i:, vejo o PID associado e, em seguida, ajusto a porta, o serviço ou a firewall. Se um processo ficar bloqueado, verifico os seus descritores abertos com lsof -p e verificar se está à espera de um ficheiro, um pipe ou um socket. Para análises mais aprofundadas, complemento a visualização com strace de forma seletiva, para monitorizar as chamadas do sistema em tempo real. É assim que resolvo falhas recorrentes de forma fiável e documento os passos a seguir para o futuro Incidentes.

Ter em conta os contentores e os namespaces

Explicado em configurações com contentores (por exemplo, com espaços de nomes de rede próprios) lsof Deteto inconsistências entre o anfitrião e o contentor. Executo o lsof diretamente no contentor ou acedo, a partir do anfitrião, ao namespace do processo de destino. É assim que percebo por que razão uma porta no contentor se encontra no estado LISTEN, mas parece „livre“ no anfitrião: encontram-se em namespaces diferentes. Procedo de forma semelhante com os namespaces de montagem: as montagens Bind e os sistemas de ficheiros Overlay aparecem na coluna NAME com os seus caminhos reais e ajudam a identificar volumes mal configurados. Além disso, organizo os descritores abertos por utilizador e por cgroup quando controlo serviços através de supervisores ou soluções de orquestração.

Análise de rede com o comando lsof -i

Com lsof -i registo as ligações ativas e escuto as ligações ocupadas Portos. Filtros como lsof -iTCP -sTCP:LISTEN escuta seletivamente serviços no estado LISTEN. Para protocolos específicos, utilizo lsof -iUDP ou portas específicas, como lsof -i:25 para servidores de e-mail. Além disso, verifico se um PID mantém várias sockets abertas, o que pode indicar fugas ou loops infinitos. Nas verificações de segurança, comparo os serviços esperados com os resultados e deteto serviços estranhos ou esquecidos Serviços. Esta visão da rede poupa tempo, porque não tenho de consultar várias ferramentas em simultâneo e vejo tudo num único local.

Aprofundar os detalhes da rede

Para consultas particularmente específicas, utilizo a sintaxe de endereços e portas de -i: Limito a pesquisa a endereços de origem ou de destino (lsof [email protected]) ou combina o endereço e a porta (lsof [email protected]:443). Com -sTCP:ESTABLISHED vejo sessões produtivas, enquanto -sTCP:LISTEN apenas apresenta os listeners. Utilizo análises UDP para identificar serviços com muitos sockets de curta duração (DNS, Syslog, NTP). Além disso, verifico se os processos estão mais expostos na rede do que o necessário (por exemplo, listeners em 0.0.0.0 (em vez de uma interface local). Isto reduz o trabalho de reforço de segurança a realizar posteriormente.

Tabela resumida: Opções mais comuns

Utilizo algumas opções principais com muita regularidade e adapto-as consoante Cenário. A tabela seguinte reúne os comandos mais importantes, acompanhados de uma breve explicação e de um exemplo. Assim, consigo encontrar mais rapidamente a forma adequada e evito ter de consultar longas páginas de ajuda. Utilizo estas opções de forma modular, o que me permite manter a flexibilidade. Quem dominar este conjunto básico consegue resolver muitas tarefas com um único Apelo.

Opção Objetivo Exemplo
-i Mostrar ligações de rede e portas ocupadas lsof -i:443
-c NOME Filtrar por nome do processo (correspondência de prefixo) lsof -c nginx
-p PID Todos os ficheiros abertos de um PID lsof -p 1234
-u USUÁRIO Recursos abertos de um utilizador lsof -u mysql
+d DIR Apenas o diretório indicado lsof +d /var/log
+D DIR Percorrer o diretório de forma recursiva lsof +D /var/log
-nP Sem pesquisa de nomes DNS e de portas (mais rápido) lsof -nP -i
-t Apresentar apenas os PIDs (compatível com scripts) lsof -t -i:80
+L1 Mostrar ficheiros eliminados, mas ainda em aberto lsof +L1

Eu uso -t frequentemente, para passar PIDs diretamente para scripts, por exemplo, para matar ou systemctl. Com +L1 encontro processos que mantêm abertos ficheiros eliminados e, assim, bloqueiam espaço de armazenamento. Em combinação com -r (repetidamente) observo alterações em curtos Intervalos. Quem realiza os testes de forma gradual evita interpretações erradas e trabalha de forma coerente. Desta forma, o diagnóstico mantém-se reproduzível e mensurável claro.

Processar a saída de forma eficiente

Vou continuar a formatar a saída diretamente, para obter os resultados mais rapidamente utilização. Com lsof -t -i:80 | xargs -r kill -TERM encerro todos os processos que estão a ocupar a porta 80. Para os relatórios, recorro a lsof -nP -i | grep LISTEN voltar e filtrar estados específicos. Também awk ajuda: lsof -nP | awk '{print $1,$2,$3,$9}' limita a visualização ao nome, PID, utilizador e caminho. Documento comandos de uma linha que funcionam e poupo-me trabalho mais tarde Pesquisar segundo os padrões adequados. Pequenos ajudantes como watch 'lsof -nP -i:443' mostram as alterações em tempo real e facilitam uma tomada de decisão mais rápida.

Automatização e saída analisável

Para exames recorrentes, utilizo o formato legível por máquina de lsof com -F. Seleciono apenas os campos de que preciso (por exemplo, processo, comando, utilizador, FD, nome) e continuo a analisá-los de forma consistente. Exemplos:

  • lsof -Fn -Fp -Fc -Fu -t -i:443 – campos minimalistas para scripts que apenas necessitam de PIDs ou nomes.
  • lsof -Fpcun -a -iTCP -sTCP:LISTEN – Recolher dados sobre os ouvintes e processá-los de forma específica.

Com -r 2 Gero uma visualização „ao vivo“ a cada dois segundos e comparo instantâneos. Nas pipelines, integro as alterações (classificar, uniq, diferença), para detetar handles novos ou que estão a desaparecer. Prevejo deliberadamente os tempos de espera, para que as consultas não fiquem bloqueadas em condições de elevada carga e as tarefas de monitorização terminem corretamente.

Boas práticas e aspetos de segurança

Inicio as análises com direitos mínimos e só os aumentei quando raiz, caso não tenha as autorizações necessárias. Desta forma, reduzo os riscos e mantenho os registos claros. Verifico as análises regulares com lsof -i em relação aos serviços que esperava encontrar, para detetar ouvintes ou ligações invulgares. Em seguida, investigo os PIDs suspeitos de forma específica através de ficheiros, bibliotecas e Soquetes. Durante as janelas de manutenção, certifico-me de que não há ficheiros eliminados, mas ainda abertos, a ocupar espaço desnecessariamente. Quem leva a segurança a sério integra o lsof nas listas de verificação e reage às anomalias com medidas definidas Passos.

Obstáculos frequentes e soluções eficazes

  • Nem todas as entradas estão visíveis: Sem acesso root, muitas vezes não tenho acesso a processos de outros utilizadores ou a identificadores relacionados com o kernel. Utilizo especificamente sudo.
  • Saída lenta: Desativo as resoluções com -nP, evite a recursão e limite com -a com toda a força.
  • +D demasiado caro: As iterações recursivas pelas pastas podem ser enormes. Começo por +d ou percursos concretos e só os amplio quando for necessário.
  • Porta ocupada, processo pouco claro: Eu combino lsof -i: -nP com -t para o PID e vou para lsof -p mais fundo.
  • „Falta espaço “livre»: lsof +L1 Encontra ficheiros abertos, mas que foram eliminados. Em seguida, reinicie ou encerre o processo de forma seletiva.
  • Contentores/Espaços de nomes: Verifico a consulta no namespace adequado; caso contrário, vejo listeners errados ou deixo escapar ficheiros abertos.

Compreender o desempenho e os limites

Em sistemas muito grandes, uma gravação completa do lsof demora algum tempo e gera um impacto percetível Carga. Por isso, aplico filtros logo no início e alterno com -nP todas as resoluções. Quando há um número elevado de identificadores, verifico em paralelo o Limites dos descritores de ficheiros e, se necessário, ative-as. Os scripts devem prever tempos limite e utilizar -t Transmito apenas os PIDs, para manter os volumes de dados reduzidos. Documento as exceções e integro verificações recorrentes nas automatizações. Desta forma, o diagnóstico mantém-se fiável e claro, mesmo sob carga controlável.

Fluxo de trabalho prático: do sintoma à causa

Começo com a pergunta: trata-se de um ficheiro, de um processo ou Porto? Depois, escolho a introdução adequada, por exemplo lsof /caminho/para/o/ficheiro, lsof -p ou lsof -i:. Verifico USER, FD, TYPE e NAME e registo o que parece estar dentro do esperado e o que me surpreende. Depois, tomo medidas: reinicio o processo, ajusto a configuração, aumento o limite ou liberto a porta. Em caso de incerteza, fixo o estado, guardo os registos e repito a medição após a alteração. Este processo mantém-me concentrado e proporciona uma análise clara Cadeia de provas.

Lista de verificação: receitas rápidas para o dia a dia

  • Quem está a bloquear o ficheiro? lsof /caminho/para/o/ficheiro – Ler o PID, reiniciar ou encerrar o processo de forma seletiva.
  • Que serviço está a ocupar a porta? lsof -nP -i: – Resolver o conflito, ajustar a porta ou o endereço de ligação.
  • Para onde está a desaparecer a praça dos discos? lsof +L1 – encontrar ficheiros abertos ou eliminados, reiniciar os PIDs envolvidos.
  • O processo está bloqueado na E/S? lsof -p – prestar atenção aos pipes, sockets ou ficheiros; se necessário, complementar com o strace.
  • Quais são os ouvintes que realmente estão a ouvir? lsof -nP -iTCP -sTCP:LISTEN – comparar com a lista de expectativas.
  • Que recursos utiliza uma conta de serviço? lsof -u – Detetar anomalias por conta.

Resumo para o dia-a-dia

lsof mostra-me quem está a bloquear cada ficheiro, diretório ou porta. Com -c, -p, -u, +d/+D e -i limito rapidamente o campo de visão. Desbloqueio ficheiros bloqueados, identifico conflitos de portas e descubro anomalias Ligações. Em combinação com -nP Trabalho com rapidez e mantenho os resultados claros e concisos. Para análises mais aprofundadas, recorro a ferramentas adicionais, documento comandos de uma linha que funcionam e integro verificações recorrentes nas automatizações. Desta forma, o diagnóstico com o lsof mantém-se direto, seguro e mensurável eficaz.

Artigos actuais