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.

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

A coluna FD mostra como o ficheiro está a ser utilizado. Um número seguido de “r” significa acesso de leitura, “w” significa escrita e “u” significa leitura e escrita. Se vir “cwd”, o processo tem essa localização como o seu diretório de trabalho atual. Isto acontece quando tem uma janela do Terminal aberta numa pasta da unidade.

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

Assim que souber o ID do processo (PID) através do resultado do lsof, pode terminá-lo:

kill 1234

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

kill -9 1234

Tenha cuidado com isto. Encerrar processos do sistema como o mds pode causar problemas temporários. O processo normalmente reiniciará automaticamente, mas poderá ver o Spotlight comportar-se de forma estranha durante um minuto. Encerrar aplicações como o Finder é geralmente seguro; o macOS reiniciará o Finder automaticamente.

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.

Indexação do Spotlight: Os processos mds, mds_stores e mdworker indexam novas unidades automaticamente. Pode esperar que terminem, desativar a indexação com sudo mdutil -i off /Volumes/NomeDaSuaUnidade ou encerrá-los diretamente.

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

O Ejecta foi construído especificamente para este problema. Mostra as suas unidades ligadas, identifica quais os processos que estão a bloquear cada uma e permite-lhe encerrar esses processos com um clique. É essencialmente uma interface gráfica para o trabalho de detetive que o lsof exige, com a inteligência para gerir processos do sistema em segurança.

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.

Se prefere não utilizar o Terminal todas as vezes, o Ejecta mostra-lhe exatamente qual o processo que está a bloquear o seu disco — e permite-lhe encerrá-lo com um clique, direto da sua barra de menus.

Comprar Agora — $9.99