A veces, me gustaría desmontar un dispositivo USB con umount /run/media/theDrive
, pero recibo un drive is busy
error.
¿Cómo averiguo qué procesos o programas están accediendo al dispositivo?
A veces, me gustaría desmontar un dispositivo USB con umount /run/media/theDrive
, pero recibo un drive is busy
error.
¿Cómo averiguo qué procesos o programas están accediendo al dispositivo?
Respuestas:
Úselo lsof | grep /media/whatever
para averiguar qué está usando el soporte.
Además, considere umount -l
(uzyunt) para evitar que nuevos procesos usen la unidad mientras realiza la limpieza.
fuser -mv /path/to/mountpoint
podría ser una alternativa más legible para descubrir procesos utilizando un punto de moint.
lsof | grep
funciona mejor para mí. fuser -mv
parece volcar más de 80 procesos no relacionados. Estoy usando los directorios de Mount Binded.
umount -l
es peligroso . mount -o bind
un 000
directorio vacío de modo en la parte superior y limpiar a través de lsof +f -- /dev/device
.
La mayoría de las veces, el mejor comando a utilizar es lsof ( “ l i s t o pluma f iles”).
lsof +f -- /media/usb0
¿Dónde /media/usb0
está el punto de montaje de la unidad USB u otro sistema de archivos para desmontar? +f --
le dice a lsof que trate el argumento posterior como un punto de montaje; por lo general, pero no siempre, se maneja solo, por lo que lsof /media/usb0
también funciona. Esto encuentra archivos abiertos (incluso los que no están vinculados), archivos mapeados en memoria, directorios actuales y algunos usos más oscuros. Deberá ejecutar el comando como root para obtener información sobre los procesos de otros usuarios (y creo que hay unices donde lsof
debe ejecutarse como root).
Hay usos que lsof no encontrará; Estos son poco comunes en los medios extraíbles. Incluyen:
/foo
si /foo/bar
es un punto de montaje./foo
si /foo/bar
es un dispositivo de bloque montado o un archivo regular montado en bucle, o si es la fuente de un montaje de enlace de Linux.Otro comando que puede servir en caso de necesidad es el fusor, que solo enumera los PID de los procesos con archivos abiertos en el dispositivo:
fuser -m /media/usb0
Puedes usarlo lsof
como dijo Peter, o si estás seguro de que solo quieres matar todas esas cosas y desmontarlo, probablemente puedas hacer algo como:
fuser -Mk /mnt/path
umount /mnt/path
-M
por seguridad.
-M
debe aplicar.
fuser
: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
Los procesos con archivos abiertos son los culpables habituales. Mostrarlos:
lsof +f -- <mountpoint or device>
Hay una ventaja en el uso en /dev/<device>
lugar de /mountpoint
: un punto de montaje desaparecerá después de un umount -l
, o puede estar oculto por un montaje superpuesto.
fuser
También se puede utilizar, pero en mi opinión lsof
tiene una salida más útil. Sin embargo, fuser
es útil cuando se trata de matar los procesos que causan tus dramas para que puedas seguir con tu vida.
Listar archivos en <mountpoint>
(ver advertencia arriba):
fuser -vmM <mountpoint>
Elimine interactivamente solo procesos con archivos abiertos para escritura:
fuser -vmMkiw <mountpoint>
Después de volver a montar solo lectura ( mount -o remount,ro <mountpoint>
), es seguro (r) eliminar todos los procesos restantes:
fuser -vmMk <mountpoint>
El culpable puede ser el núcleo mismo. Otro sistema de archivos montado en el sistema de archivos que está intentando umount
causarle dolor. Verifícalo con:
mount | grep <mountpoint>/
Para montajes de bucle invertido ( gracias Stephen Kitt ), también verifique la salida de:
losetup -la
Los inodos anónimos pueden ser creados por:
open
con O_TMPFILE
)Estos son el tipo de pokemon más difícil de alcanzar, y aparecen en lsof
la TYPE
columna como a_inode
(que no está documentada en la lsof
página del manual ).
No aparecerán lsof +f -- /dev/<device>
, por lo que deberá:
lsof | grep a_inode
Para ver los procesos de eliminación de inodos anónimos, consulte: Lista de relojes inotify actuales (nombre de ruta, PID) .
inotify
relojes (Linux)Este comentario explica por qué inotify
no debe impedir que un desmontaje, pero esta nota se describen las situaciones en las que voluntad :
un desmontaje puede colgar en la
vx_softcnt_flush()
llamada. El bloqueo ocurre porque los relojes inotify incrementan lai_count
variable y hacenv_os_hold value
que permanezca elevada hasta que el observador inotify suelte la retención.
lsof
.
Mountpoints
sección.
Para (al menos) OpenBSD:
$ fstat /mnt/mountpoint
Por ejemplo (usar doas
para ejecutar fstat
como root ya que de lo contrario solo veríamos nuestros propios procesos):
$ 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/
En este caso, no podría desmontar /usr/ports
hasta que el usuario _pbuild
haya terminado de ejecutar esos dos make
procesos.
Este es un escollo común: debe recurrir a un usuario diferente (ya sea root o cualquier otro usuario), cambiar al directorio de un dispositivo montado y luego cerrar sesión como ese usuario. Cuando olvides que te fuiste en ese directorio, puedes intentar encontrarlo hasta que estés ciego. lsof
muestra al shell qué directorio actual está usando ese dispositivo. Es posible que desee su como ese usuario nuevamente para cambiar su directorio.