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.

(Updated )

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).

FD descreve como o arquivo foi aberto: r para leitura, w para gravação, u para ambas. Isso não indica atividade atual nem prova que o volume não tem gravações pendentes.

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 -a -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 -a -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

Salve seu trabalho, termine cópias e backups e encerre os apps normalmente antes de tentar ejetar de novo. Forçar o encerramento ou a ejeção pode causar perda de dados; Ejecta não certifica a segurança das gravações.

kill 1234

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

kill -9 1234

Os nomes dos processos do Spotlight não provam acesso somente de leitura. Não force o encerramento de mds ou mds_stores para liberar um disco. Espere, feche seus apps e tente uma ejeção normal. Ejecta identifica esses processos, mas não oferece encerramento comum de processos do sistema. Se o disco continuar bloqueado, salve tudo e desligue completamente o Mac antes de desconectar.

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.

Os nomes dos processos do Spotlight não provam acesso somente de leitura. Não force o encerramento de mds ou mds_stores para liberar um disco. Espere, feche seus apps e tente uma ejeção normal. Ejecta identifica esses processos, mas não oferece encerramento comum de processos do sistema. Se o disco continuar bloqueado, salve tudo e desligue completamente o Mac antes de desconectar.

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?”.

Ejecta: Ejecta oferece diagnóstico gratuito de discos sem teste por tempo limitado. A licença paga libera encerramento e ejeção para apps compatíveis, Ejetar Tudo e controles do Time Machine. Processos do sistema podem exigir espera, autorização ou desligamento. Salve o trabalho e termine as transferências primeiro.

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.

Ejecta oferece diagnóstico gratuito de discos sem teste por tempo limitado. A licença paga libera encerramento e ejeção para apps compatíveis, Ejetar Tudo e controles do Time Machine. Processos do sistema podem exigir espera, autorização ou desligamento. Salve o trabalho e termine as transferências primeiro.

Comprar agora - $29 $9.99