diskutil eject: como ejetar unidades pelo Terminal do Mac

Utilize diskutil eject /Volumes/Nome para ejetar unidades pelo Terminal do Mac. Guia completo: listar unidades, forçar desmontagem, encerrar processos de bloqueio com lsof.

(Updated )

O Finder diz que a unidade está em utilização. Não diz o que a está a utilizar ou o que fazer em relação a isso. O Terminal faz as duas coisas.

Resposta rápida: Execute diskutil eject /Volumes/NomeDoSeuDisco para ejetar um disco a partir do Terminal. Se falhar, utilize sudo lsof /Volumes/NomeDoSeuDisco para ver o que está a bloquear a ejeção, kill <PID> para terminar o processo responsável e ejete novamente. Em último recurso, diskutil unmountDisk force /dev/diskN força a saída do disco, mas faça-o apenas quando nada estiver a gravar.

Se se sente à vontade com a linha de comandos, o Terminal é a forma mais poderosa de lidar com ejeções de unidades persistentes no macOS. E se ainda não se sente à vontade, estes comandos são um bom sítio por onde começar.

Ejeção básica com diskutil eject

A forma mais direta de ejetar uma unidade externa pelo Terminal do Mac:

diskutil eject /Volumes/NomeDaSuaUnidade

Substitua NomeDaSuaUnidade pelo nome real da sua unidade, exatamente como aparece no Finder. Se o nome tiver espaços, coloque-o entre aspas:

diskutil eject "/Volumes/A Minha Unidade"

Isto faz o mesmo que clicar no botão de ejetar no Finder. Se funcionar, a unidade é desmontada de forma limpa e já está. Se falhar, recebe uma mensagem de erro mais informativa do que o Finder alguma vez fornece.

Também pode desmontar sem ejetar (a unidade permanece visível no Utilitário de Disco, mas não está montada):

diskutil unmount /Volumes/NomeDaSuaUnidade

A diferença é importante para unidades com várias partições. unmount remove um volume. eject remove o dispositivo físico e todos os seus volumes de uma só vez.

Encontrar o identificador da sua unidade com diskutil list

Antes de utilizar comandos mais avançados, precisa do identificador da sua unidade. Liste todas as unidades ligadas:

diskutil list

A lista mostra cada unidade e as suas partições. A sua unidade externa será algo como disk4 ou disk5. As unidades internas são normalmente disk0 e disk1.

Para uma visão geral mais legível apenas de unidades externas:

diskutil list external

Depois de saber o identificador da unidade, também pode ejetar utilizando o caminho /dev/ em vez do nome do volume:

diskutil eject /dev/disk4

Isto é útil quando o nome do volume contém caracteres invulgares ou quando o volume não está montado mas a unidade ainda está ligada.

Como ejetar todas as unidades externas de uma só vez

Se precisar de ejetar todas as unidades externas com um único comando, existem duas abordagens.

Utilizando o diskutil para encontrar e ejetar todas as unidades externas:

diskutil list external | grep -o 'disk[0-9]*$' | while read disk; do diskutil eject "/dev/$disk"; done

Ou utilizando AppleScript pelo Terminal, que espelha o que o Finder faz:

osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)'

A abordagem do AppleScript apenas ejeta unidades que o Finder considera ejetáveis. Ignora o seu disco de arranque e volumes de rede, que é normalmente o que deseja.

Forçar a desmontagem quando o diskutil eject falha

Se uma ejeção normal falhar com um erro como “couldn’t unmount disk”, force a desmontagem:

diskutil unmount force /Volumes/NomeDaSuaUnidade

Ou desmonte todos os volumes numa unidade específica de uma só vez:

diskutil unmountDisk force /dev/disk4

A desmontagem forçada diz ao macOS para libertar o volume independentemente do que o está a utilizar. É mais controlado do que desligar fisicamente a unidade (o sistema ainda limpa as caches e notifica os processos), mas não espera que os processos fechem os ficheiros de forma limpa.

Utilize a desmontagem forçada quando souber que nada de importante está a ser escrito. É o equivalente na linha de comandos a forçar a ejeção pelo Utilitário de Disco. Consulte o nosso guia sobre quando a ejeção forçada é segura vs. arriscada antes de utilizar isto numa unidade que estava a ser utilizada ativamente.

Descobrir o que está a bloquear a ejeção com lsof

Este é o comando que torna o Terminal inestimável para problemas de ejeção:

lsof /Volumes/NomeDaSuaUnidade

lsof significa “list open files” (listar ficheiros abertos). Mostra todos os processos que têm um ficheiro aberto naquele volume: o nome do processo, o ID do processo (PID), o utilizador que o está a executar e qual o ficheiro que está aberto.

Para resultados completos (incluindo processos do sistema), execute-o com sudo:

sudo lsof /Volumes/NomeDaSuaUnidade

Sem sudo, apenas vê os processos que pertencem à sua conta de utilizador. Processos do sistema como o mds do Spotlight ou o backupd do Time Machine não aparecerão. Com sudo, vê tudo o que está realmente a manter a unidade aberta.

Ler a saída do lsof

A saída assemelha-se a isto:

COMMAND   PID   USER   FD   TYPE   DEVICE   SIZE/OFF   NODE   NAME
mds       123   root   12r  REG    1,8      4096       789    /Volumes/AMinhaUnidade/.Spotlight-V100/...
Finder    456   aaron  15r  DIR    1,8      1024       2      /Volumes/AMinhaUnidade
Dropbox   789   aaron  8u   REG    1,8      8192       345    /Volumes/AMinhaUnidade/Projetos/.dropbox

As colunas que mais importam:

  • COMMAND: O nome do processo. Isto diz-lhe o que está a bloquear a ejeção.
  • PID: O ID do processo. Utilizará isto para encerrar o processo se necessário.
  • FD: 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.
  • NAME: O ficheiro específico a ser acedido. Isto revela muitas vezes exatamente por que razão o processo ali está.

Culpados comuns: mds (indexação do Spotlight), backupd (Time Machine), Dropbox, Google Drive, o próprio Finder. Veja os nossos artigos detalhados sobre o Spotlight a bloquear a ejeção e o iCloud/Dropbox a impedir a ejeção para correções específicas.

Encerrar processos de bloqueio

Feche as apps compatíveis pela barra de menus. Os processos do sistema têm tratamento separado e podem exigir espera ou desligar o Mac. 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 789

Isto envia um sinal de terminação graciosa. O processo tem a oportunidade de fechar ficheiros e limpar tudo. Dê-lhe alguns segundos para sair e tente ejetar novamente.

Se não responder a um encerramento gracioso:

kill -9 789

Forçar a saída é o último recurso. Pode perder trabalho por guardar ou interromper escritas. Guarde primeiro e espere que as transferências terminem. 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.

Guarde o trabalho, termine cópias e backups e feche as apps normalmente antes de tentar ejetar novamente.

Fluxo de trabalho completo de resolução de problemas

Guarde o trabalho, termine cópias e backups e feche as apps normalmente antes de tentar ejetar novamente.

diskutil eject "/Volumes/YourDriveName"
sudo lsof "/Volumes/YourDriveName"

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.

O nome de um processo ou a lista de ficheiros abertos não prova que não há escritas em curso. 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.

Variações de diagnóstico úteis

Verifique se o Spotlight especificamente está a prender a sua unidade:

lsof /Volumes/NomeDaSuaUnidade | grep mds

Liste apenas os nomes únicos dos processos que bloqueiam a ejeção (sem linhas duplicadas):

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

Observe o E/S de disco em tempo real para ver se algo está a escrever ativamente:

sudo fs_usage -f diskio | grep NomeDaSuaUnidade

Isto corre continuamente e mostra cada operação de disco à medida que acontece. Pressione Control-C para parar. Utilize isto quando o lsof mostra um processo mas não tem a certeza se este está a escrever ativamente ou apenas a manter um handle antigo.

Quando o Terminal dá mais trabalho do que vale a pena

Estes comandos são poderosos e, depois de os utilizar algumas vezes, tornam-se naturais. Mas existe um custo real em trocar o contexto do seu trabalho por uma janela do Terminal: executar comandos de diagnóstico, analisar saídas técnicas, decidir qual PID é seguro encerrar.

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.

Sem limite de computadores ou ativações. Pedidos de reembolso no prazo de 30 dias.

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