À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?
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.
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:
/foo
E se /foo/bar
é um ponto de montagem./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.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
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>
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 pode ser criado por:
open
com O_TMPFILE
)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áveli_count
E fazem com quev_os_hold value
Permaneça elevado até que o observador inotify libere a retenção.
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
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.
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
.