O comando lsof explicado para utilizadores de Mac

Domine o comando lsof para descobrir quais os processos que têm ficheiros abertos no seu Mac. Um guia para programadores e utilizadores avançados.

(Updated )

A sua unidade externa não ejeta. O macOS dá-lhe a mensagem enlouquecedoramente vaga de que “um ou mais programas podem estar em utilização”. Quais programas? Não diz. É aqui que entra o lsof.

O nome significa “list open files” (listar ficheiros abertos) e faz exatamente isso. Em sistemas baseados em Unix, como o macOS, quase tudo é tratado como um ficheiro, incluindo ligações de rede, dispositivos e volumes de disco. Quando não consegue ejetar uma unidade, o lsof diz-lhe precisamente qual o processo que a está a manter como refém.

Sintaxe básica

A forma mais simples de utilizar o lsof para problemas de ejeção é:

lsof /Volumes/NomeDaSuaUnidade

Substitua “NomeDaSuaUnidade” pelo nome real da sua unidade. Se o nome tiver espaços, coloque todo o caminho entre aspas:

lsof "/Volumes/AMinhaUnidadeDeBackup"

Isto devolve uma lista de cada processo que tem um handle de ficheiro aberto naquele volume. Cada linha mostra o nome do processo, o seu ID (PID), o utilizador que o executa e informações sobre o ficheiro específico a ser acedido.

Ler o resultado

Um resultado típico do lsof assemelha-se a 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 utilizaria para o encerrar) e NAME (o caminho real do ficheiro a ser acedido).

FD descreve como o ficheiro foi aberto: r para leitura, w para escrita, u para ambas. Não indica a atividade atual nem prova que o volume não tem escritas pendentes.

Descobrir o que está a bloquear a sua unidade

Para problemas de ejeção especificamente, normalmente apenas precisa de saber quais os nomes de processos que aparecem. Culpados comuns incluem mds e mds_stores (indexação do Spotlight), Finder, QuickLookUIService (geração de miniaturas) e fsevents (observador do sistema de ficheiros).

Se vir muito resultado e quiser filtrá-lo, pode utilizar o grep:

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

Isto remove a linha de cabeçalho para que veja apenas os processos reais. Se quiser apenas os nomes únicos dos processos:

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

Flags úteis

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

lsof -a -c mds /Volumes/NomeDaSuaUnidade

Isto mostra apenas processos cujos nomes começam por “mds”.

A flag +D lista recursivamente todos os ficheiros abertos num diretório:

lsof +D /Volumes/NomeDaSuaUnidade

Isto é mais minucioso do que a sintaxe básica, mas pode ser lento em unidades grandes com muitos ficheiros.

Para ver quais os processos que um utilizador específico tem abertos na unidade:

lsof -a -u oseuutilizador /Volumes/NomeDaSuaUnidade

Utilizar o lsof sem sudo

Por predefinição, o lsof apenas mostra processos que pertencem à sua conta de utilizador. Processos do sistema executados pelo root (como o mds do Spotlight) não aparecerão a menos que execute o lsof com sudo:

sudo lsof /Volumes/NomeDaSuaUnidade

Terá de introduzir a sua palavra-passe. Para resolver problemas de ejeção, utilizar o sudo é quase sempre necessário, uma vez que os processos do sistema são frequentemente os bloqueadores.

Encerrar o processo de bloqueio

Guarde o trabalho, termine cópias e backups e feche as apps normalmente antes de tentar ejetar novamente. Forçar a saída ou a ejeção pode causar perda de dados; Ejecta não certifica a segurança das escritas.

kill 1234

Substitua 1234 pelo PID real. Se isso não funcionar, pode forçá-lo:

kill -9 1234

Os nomes dos processos do Spotlight não provam acesso apenas de leitura. Não force a saída de mds ou mds_stores para libertar um disco. Espere, feche as apps e tente uma ejeção normal. Ejecta identifica estes processos, mas não oferece a saída habitual de processos do sistema. Se o disco continuar bloqueado, guarde tudo e desligue completamente o Mac antes de o desligar do computador.

Para aplicações que lhe pertencem (como uma janela do Terminal com uma shell parada no diretório da unidade), é mais limpo fechar a aplicação normalmente ou navegar para fora da unidade antes de tentar ejetar.

Cenários comuns

Terminal com diretório atual na unidade: Se fez cd para uma pasta na sua unidade externa, esse processo de shell manterá a unidade aberta. Ou mude para outro local (cd ~) ou feche essa janela do Terminal.

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

Os nomes dos processos do Spotlight não provam acesso apenas de leitura. Não force a saída de mds ou mds_stores para libertar um disco. Espere, feche as apps e tente uma ejeção normal. Ejecta identifica estes processos, mas não oferece a saída habitual de processos do sistema. Se o disco continuar bloqueado, guarde tudo e desligue completamente o Mac antes de o desligar do computador.

Aplicações em segundo plano com ficheiros abertos: Algumas aplicações mantêm referências a ficheiros recentes mesmo depois de ter fechado os documentos. Aplicações criativas como o Photoshop ou editores de vídeo são infratores comuns. Encerrar a aplicação completamente costuma libertar os ficheiros.

Além da linha de comandos

Se não se sente à vontade com o Terminal ou não quer decifrar o resultado do lsof cada vez que precisa de desligar uma unidade, existem opções gráficas.

O Monitor de Atividade pode mostrar-lhe ficheiros abertos para um processo específico, mas tem de saber antecipadamente qual o processo a inspecionar. Não responde facilmente a “o que é que está a utilizar esta unidade?”.

Ejecta: Ejecta oferece diagnóstico gratuito de discos sem período de teste limitado. A licença paga desbloqueia saída e ejeção para apps compatíveis, Ejetar tudo e controlos do Time Machine. Processos do sistema podem exigir espera, autorização ou desligar o Mac. Guarde o trabalho e termine primeiro as transferências.

A linha de comandos é poderosa para quem a prefere, mas não devia ser obrigatória para algo tão simples como desligar uma unidade.

Ejecta oferece diagnóstico gratuito de discos sem período de teste limitado. A licença paga desbloqueia saída e ejeção para apps compatíveis, Ejetar tudo e controlos do Time Machine. Processos do sistema podem exigir espera, autorização ou desligar o Mac. Guarde o trabalho e termine primeiro as transferências.

Comprar Agora - $29 $9.99