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).
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 -Artigos relacionados
diskutil eject: como ejetar unidades pelo Terminal do Mac
Utilize diskutil eject /Volumes/Nome para ejetar unidades pelo Terminal do Mac. Guia completo: listar …
Como corrigir 'Disco não ejetado corretamente' no Mac
Saiba por que razão o macOS mostra o aviso 'disco não ejetado corretamente' e como ejetar em segurança as suas …
APFS vs exFAT: Qual o formato para a sua unidade externa no Mac
Escolher o sistema de ficheiros correto para a sua unidade externa afeta tudo, desde o desempenho à segurança …
Porque é que o Spotlight bloqueia a ejeção do disco
A indexação do Spotlight é uma das razões mais comuns para não conseguir ejetar uma unidade externa. Veja como …