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