ti-enxame.com

Como descubro quais processos estão impedindo a desmontagem de um dispositivo?

Às vezes, eu gostaria de desmontar um dispositivo usb com umount /run/media/theDrive, mas eu recebo um drive is busy erro.

Como descubro quais processos ou programas estão acessando o dispositivo?

70
Stefan

Usar lsof | grep /media/whatever para descobrir o que está usando o suporte.

Além disso, considere umount -l (quantidade lenta) para impedir que novos processos usem a unidade enquanto você limpa.

70
Peter Eisentraut

Na maioria das vezes, o melhor comando a ser usado é lsof (“ l i s t o caneta f iles ").

lsof +f -- /media/usb0

onde /media/usb0 é o ponto de montagem da unidade USB ou outro sistema de arquivos para desmontar. +f -- diz ao lsof para tratar o argumento subsequente como um ponto de montagem; geralmente, mas nem sempre, gerencia por conta própria, de modo que lsof /media/usb0 também funciona. Ele encontra arquivos abertos (mesmo os não vinculados), arquivos mapeados na memória, diretórios atuais e alguns usos mais obscuros. Você precisará executar o comando como root para obter informações sobre os processos de outros usuários (e acho que existem unidades onde lsof deve ser executado como root).

Existem usos que lsof não encontrará; estes são incomuns em mídia removível. Eles incluem:

  • pontos de montagem: você não pode desmontar /foo E se /foo/bar é um ponto de montagem.
  • montar dispositivos: você não pode desmontar /foo E se /foo/bar é um dispositivo de bloco montado ou um arquivo regular montado em loop ou se é a fonte de uma montagem de ligação do Linux.
  • Exportação NFS: lsof não detectará que uma árvore é exportada por um servidor NFS do kernel.

Outro comando que pode servir em uma pitada é o fusor, que lista apenas os PIDs de processos com arquivos abertos no dispositivo:

fuser -m /media/usb0
37

Abrir arquivos

Processos com arquivos abertos são os culpados de sempre. Mostre-os:

lsof +f -- <mountpoint or device>

Há uma vantagem em usar /dev/<device> Em vez de /mountpoint: Um ponto de montagem desaparecerá após um umount -l Ou poderá ser oculto por uma montagem sobreposta.

fuser também pode ser usado, mas na minha opinião lsof tem uma saída mais útil. No entanto, fuser é útil quando se trata de matar os processos que causam seus dramas, para que você possa continuar sua vida.

Listar arquivos em <mountpoint> (Veja a advertência acima):

fuser -vmM <mountpoint>

Interativamente, mate apenas processos com arquivos abertos para gravação:

fuser -vmMkiw <mountpoint>

Após remontar somente leitura (mount -o remount,ro <mountpoint>), É seguro (r) eliminar todos os processos restantes:

fuser -vmMk <mountpoint>

Pontos de montagem

O culpado pode ser o próprio kernel. Outro sistema de arquivos montado no sistema de arquivos que você está tentando umount causará pesar. Verificar com:

mount | grep <mountpoint>/

Para montagens de loopback ( obrigado Stephen Kitt ), verifique também a saída de:

losetup -la

Inodes anônimos (Linux)

inodes anônimos pode ser criado por:

  • Arquivos temporários (open com O_TMPFILE)
  • inotify relógios
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Esse é o tipo mais evasivo de pokemon e aparece na coluna lsof 'TYPE como a_inode (Que não está documentado na página do manual lsof ).

Eles não aparecerão em lsof +f -- /dev/<device>, Portanto, você precisará:

lsof | grep a_inode

Para processos de extermínio contendo inodes anônimos, consulte: Listar os relógios atuais para identificação (nome do caminho, PID) .

inotify relógios (Linux)

Este comentário explica por que inotify não deve impedir uma desmontagem, mas esta nota descreve as situações em que será :

uma desmontagem pode travar na chamada vx_softcnt_flush(). A interrupção ocorre porque os relógios inotify incrementam a variável i_count E fazem com que v_os_hold value Permaneça elevado até que o observador inotify libere a retenção.

9
Tom Hale

Você pode usar lsof como Peter disse, ou se tiver certeza de que deseja matar todas essas coisas e desmontá-las, provavelmente poderá fazer algo como:

fuser -Mk /mnt/path
umount /mnt/path
8
pioto

Se você usa o GNOME, a desmontagem via Nautilus exibirá uma mensagem informando qual processo ainda está usando a unidade e o arquivo que está usando.

alt text

5
tshepang

Para (pelo menos) OpenBSD:

$ fstat /mnt/mountpoint

Por exemplo (usando doas para executar fstat como root, caso contrário, veríamos apenas nossos próprios processos):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

Nesse caso, não seria possível desmontar /usr/ports até o usuário _pbuild concluiu a execução desses dois processos make.

1
Kusalananda