O comando lsof explicado para usuários de Mac

Domine o comando lsof para descobrir quais processos têm arquivos abertos no seu Mac. Um guia para desenvolvedores e usuários avançados.

Seu disco externo não ejeta. O macOS exibe a mensagem enlouquecedoramente vaga de que “um ou mais programas podem estar em uso”. Quais programas? Ele não diz. É aqui que entra o lsof.

O nome significa “list open files” (listar arquivos abertos) e ele faz exatamente isso. Em sistemas baseados em Unix, como o macOS, quase tudo é tratado como um arquivo, incluindo conexões de rede, dispositivos e volumes de disco. Quando você não consegue ejetar um disco, o lsof diz precisamente qual processo o está mantendo como refém.

Sintaxe básica

A maneira mais simples de usar o lsof para problemas de ejeção é:

lsof /Volumes/NomeDoSeuDisco

Substitua “NomeDoSeuDisco” pelo nome real do seu disco. Se o nome tiver espaços, envolva todo o caminho em aspas:

lsof "/Volumes/Meu Disco de Backup"

Isso retorna uma lista de cada processo que possui um handle de arquivo aberto naquele volume. Cada linha mostra o nome do processo, seu ID (PID), o usuário que o executa e informações sobre o arquivo específico que está sendo acessado.

Lendo a saída

Uma saída típica do lsof se parece com isto:

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mds_store  1234   root   4r   REG   1,12   524288  ...  /Volumes/External/.Spotlight-V100/...
Finder     5678   voce   3r   DIR   1,12     1024  ...  /Volumes/External

As colunas que mais importam são COMMAND (o nome do processo), PID (ID do processo que você usaria para encerrá-lo) e NAME (o caminho real do arquivo sendo acessado).

A coluna FD mostra como o arquivo está sendo usado. Um número seguido de “r” significa acesso de leitura, “w” significa gravação e “u” significa leitura e gravação. Se você vir “cwd”, o processo tem aquele local como seu diretório de trabalho atual. Isso acontece quando você tem uma janela do Terminal aberta em uma pasta no disco.

Descobrindo o que está bloqueando seu disco

Para problemas de ejeção especificamente, você geralmente só precisa saber quais nomes de processos aparecem. Culpados comuns incluem mds e mds_stores (indexação do Spotlight), Finder, QuickLookUIService (geração de miniaturas) e fsevents (observador do sistema de arquivos).

Se você vir muita saída e quiser filtrá-la, pode usar o grep:

lsof /Volumes/NomeDoSeuDisco | grep -v "^COMMAND"

Isso remove a linha de cabeçalho para que você veja apenas os processos reais. Se quiser apenas os nomes exclusivos dos processos:

lsof /Volumes/NomeDoSeuDisco | awk '{print $1}' | sort -u

Flags úteis

A flag -c filtra pelo nome do comando. Se você suspeitar que o Spotlight é o problema:

lsof -c mds /Volumes/NomeDoSeuDisco

Isso mostra apenas processos cujos nomes começam com “mds”.

A flag +D lista recursivamente todos os arquivos abertos em um diretório:

lsof +D /Volumes/NomeDoSeuDisco

Isso é mais completo que a sintaxe básica, mas pode ser lento em discos grandes com muitos arquivos.

Para ver quais processos um usuário específico tem aberto no disco:

lsof -u seuusuário /Volumes/NomeDoSeuDisco

Usando o lsof sem sudo

Por padrão, o lsof mostra apenas os processos pertencentes à sua conta de usuário. Processos do sistema executados pelo root (como o mds do Spotlight) não aparecerão a menos que você execute o lsof com sudo:

sudo lsof /Volumes/NomeDoSeuDisco

Você precisará digitar sua senha. Para solucionar problemas de ejeção, usar o sudo é quase sempre necessário, já que os processos do sistema são frequentemente os bloqueadores.

Encerrando o processo de bloqueio

Depois de saber o ID do processo (PID) pela saída do lsof, você pode terminá-lo:

kill 1234

Substitua 1234 pelo PID real. Se isso não funcionar, você pode forçar:

kill -9 1234

Tenha cuidado com isso. Encerrar processos do sistema como o mds pode causar problemas temporários. O processo geralmente reiniciará automaticamente, mas você pode ver o Spotlight se comportar de forma estranha por um minuto. Encerrar aplicativos como o Finder é geralmente seguro; o macOS reiniciará o Finder automaticamente.

Para aplicativos que você possui (como uma janela do Terminal com um shell parado no diretório do disco), é mais limpo fechar o aplicativo normalmente ou navegar para fora do disco antes de tentar ejetar.

Cenários comuns

Terminal com diretório atual no disco: Se você deu cd em uma pasta no seu disco externo, esse processo de shell manterá o disco aberto. Ou mude para outro lugar (cd ~) ou feche a janela do Terminal.

Janelas do Finder: Se o Finder tiver uma janela aberta para o disco, ou mesmo se estiver com o disco selecionado na barra lateral, ele pode impedir a ejeção. Feche quaisquer janelas do Finder que mostrem o conteúdo do disco.

Indexação do Spotlight: Os processos mds, mds_stores e mdworker indexam novos discos automaticamente. Você pode esperar que eles terminem, desativar a indexação com sudo mdutil -i off /Volumes/NomeDoSeuDisco ou encerrá-los diretamente.

Apps em segundo plano com arquivos abertos: Alguns aplicativos mantêm referências a arquivos recentes mesmo depois de você ter fechado os documentos. Aplicativos criativos como Photoshop ou editores de vídeo são infratores comuns. Encerrar o aplicativo inteiramente geralmente libera os arquivos.

Além da linha de comando

Se você não se sente confortável com o Terminal ou não quer decifrar a saída do lsof toda vez que precisar desconectar um disco, existem opções gráficas.

O Monitor de Atividade pode mostrar arquivos abertos para um processo específico, mas você já precisa saber qual processo inspecionar. Ele não responde facilmente a “o que está usando este disco?”.

O Ejecta foi construído especificamente para esse problema. Ele mostra seus discos conectados, identifica quais processos estão bloqueando cada um e permite que você encerre esses processos com um clique. É essencialmente uma interface gráfica para o trabalho de detetive que o lsof exige, além da inteligência para lidar com processos do sistema com segurança.

A linha de comando é poderosa para quem a prefere, mas não deveria ser obrigatória para algo tão simples quanto desconectar um disco.

Se você prefere não usar o Terminal todas as vezes, o Ejecta mostra exatamente qual processo está bloqueando seu disco — e permite que você o encerre com um clique, direto da sua barra de menus.

Comprar Agora — $9.99