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.

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.

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: Descritor de ficheiro e modo de acesso. r significa leitura, w significa escrita, u significa leitura/escrita. Se vir w ou u, algo está a escrever ativamente na unidade e a ejeção forçada é arriscada.
  • 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

Assim que souber o PID de um processo de bloqueio, termine-o de forma graciosa:

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

Isto força a terminação imediata. O processo não chega a limpar nada. Utilize isto como último recurso — especialmente para processos do sistema.

Para encerrar todos os processos que utilizam um volume específico num único comando:

sudo lsof -t /Volumes/NomeDaSuaUnidade | xargs kill

A flag -t faz com que o lsof mostre apenas PIDs e o xargs envia-os para o kill. Tenha cuidado: isto encerra todos os processos que utilizam a unidade, incluindo aqueles que podem estar a meio de um trabalho importante.

Fluxo de trabalho completo de resolução de problemas

Aqui está a sequência completa para uma unidade que não ejeta:

# Passo 1: Tente a ejeção normal
diskutil eject /Volumes/NomeDaSuaUnidade

# Passo 2: Se falhar, veja o que está a bloquear
sudo lsof /Volumes/NomeDaSuaUnidade

# Passo 3: Encerre o processo infrator (substitua o PID pelo número real)
kill 12345

# Passo 4: Tente ejetar novamente
diskutil eject /Volumes/NomeDaSuaUnidade

# Passo 5: Se continuar presa, force a desmontagem
diskutil unmountDisk force /dev/disk4

A maioria dos problemas resolve-se no Passo 3. Identifique o bloqueador, encerre-o e ejete de forma limpa.

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.

O Ejecta faz tudo o que foi descrito acima automaticamente. Monitoriza as suas unidades, identifica cada processo de bloqueio e oferece-lhe um botão de um clique para encerrar cada um. A mesma informação que obteria do sudo lsof, apresentada visualmente na sua barra de menus — sem comandos para decorar, sem saídas para analisar.

Por $9.99, obtém uma ferramenta que substitui todo este fluxo de trabalho de várias etapas do Terminal por um único clique. Se enfrenta este problema mais do que uma vez por mês, ela paga-se a si própria em frustração poupada logo na primeira semana. Experimente o Ejecta grátis por 7 dias — sem necessidade de Terminal.

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