Comment savoir quels processus empêchent le démontage d'un périphérique?

59

Parfois, je voudrais démonter un périphérique USB avec umount /run/media/theDrive, mais je reçois une drive is busyerreur.

Comment savoir quels processus ou programmes accèdent à l'appareil?

Stefan
la source
1
plusieurs autres votes pour la même question / réponse ici: stackoverflow.com/questions/624154/…
Trevor Boyd Smith Le

Réponses:

59

Utilisez lsof | grep /media/whateverpour savoir ce qui utilise la monture.

En outre, envisagez umount -l(laumount umount) pour empêcher de nouveaux processus d’utiliser le lecteur pendant le nettoyage.

Peter Eisentraut
la source
24
fuser -mv /path/to/mountpointpourrait être une alternative plus lisible pour découvrir des processus utilisant un point de repère.
Riccardo Murri
@ RiccardoMurri lsof | grepfonctionne mieux pour moi. fuser -mvsemble simplement vider plus de 80% des processus sans rapport. J'utilise des répertoires liés au montage.
Ricky Boyce
1
umount -lest dangereux . mount -o bind à la place, un 000répertoire vide en mode et nettoyez via lsof +f -- /dev/device.
Tom Hale
35

La plupart du temps, la meilleure commande à utiliser est lsof ( « l i s t o pen f Iles »).

lsof +f -- /media/usb0

/media/usb0est le point de montage du lecteur USB ou d'un autre système de fichiers à démonter. +f --indique à lsof de traiter l'argument suivant comme un point de montage; il gère généralement, mais pas toujours, tout seul, de sorte que cela lsof /media/usb0fonctionne également. Cela permet de trouver des fichiers ouverts (même non liés), des fichiers mappés en mémoire, des répertoires en cours et des utilisations plus obscures. Vous devez exécuter la commande en tant que root pour obtenir des informations sur les processus des autres utilisateurs (et je pense qu'il existe des unités qui lsofdoivent être exécutées en tant que root).

Il y a des utilisations que lsof ne trouvera pas; ceux-ci sont rares sur les supports amovibles. Ils incluent:

  • points de montage: vous ne pouvez pas démonter /foos'il /foo/bars'agit d'un point de montage.
  • Monter des périphériques: vous ne pouvez pas démonter /foos'il /foo/bars'agit d'un périphérique bloc monté ou d'un fichier normal monté en boucle, ou s'il est la source d'un montage de liaison Linux.
  • Exportation NFS: lsof ne détectera pas qu'une arborescence est exportée par un serveur NFS du noyau.

Une autre commande pouvant servir dans un pincement est fuser, qui ne répertorie que les PID des processus avec des fichiers ouverts sur le périphérique:

fuser -m /media/usb0
Gilles, arrête de faire le mal
la source
8

Vous pouvez utiliser lsofcomme Peter l'a dit, ou si vous êtes sûr de vouloir simplement tuer toutes ces choses et les démonter, vous pouvez probablement faire quelque chose comme:

fuser -Mk /mnt/path
umount /mnt/path
pioto
la source
1
Si vous envisagez de le faire, envisagez d’utiliser la -Msécurité.
Tom Hale
@TomHale Vous voudrez peut-être préciser quelle commande -Mdoit être appliquée.
HSchmale
1
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.
Tom Hale
6

Ouvrir des fichiers

Les processus avec des fichiers ouverts sont les coupables habituels. Les afficher:

lsof +f -- <mountpoint or device>

Il y a un avantage à utiliser /dev/<device>plutôt que /mountpoint: un point de montage disparaît après un umount -lou peut être caché par un montage superposé.

fuserpeut également être utilisé, mais à mon avis lsofa une sortie plus utile. Cependant, il fuserest utile de tuer les processus qui causent vos drames afin que vous puissiez continuer votre vie.

Liste des fichiers sur <mountpoint>(voir l'avertissement ci-dessus):

fuser -vmM <mountpoint>

Ne supprimez de manière interactive que les processus dont les fichiers sont ouverts à l'écriture:

fuser -vmMkiw <mountpoint>

Après avoir remonté read-only ( mount -o remount,ro <mountpoint>), il est prudent de tuer tous les processus restants:

fuser -vmMk <mountpoint>

Points de montage

Le coupable peut être le noyau lui-même. Un autre système de fichiers monté sur le système de fichiers que vous essayez d'essayer umountcausera des problèmes. Vérifier avec:

mount | grep <mountpoint>/

Pour les montages en boucle ( merci Stephen Kitt ), vérifiez également la sortie de:

losetup -la

Inodes anonymes (Linux)

Les inodes anonymes peuvent être créés par:

  • Fichiers temporaires ( openavec O_TMPFILE)
  • inotify montres
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Ce type de pokemon est le plus insaisissable et apparaît dans lsofla TYPEcolonne 's sous la forme a_inode(non documenté dans la lsofpage de manuel ).

Ils n'apparaîtront pas dans lsof +f -- /dev/<device>, vous devrez donc:

lsof | grep a_inode

Pour plus d'informations sur les processus contenant des inodes anonymes, voir: Liste des surveillances inotify actuelles (nom du chemin, PID) .

inotify montres (Linux)

Ce commentaire explique pourquoi inotify ne devrait pas empêcher un démontage, mais cette note décrit les situations dans lesquelles il va :

un démontage peut être suspendu pendant l' vx_softcnt_flush()appel. Le blocage se produit parce que les contrôles inotify incrémentent la i_countvariable et le v_os_hold valuemaintiennent élevés jusqu'à ce que l'observateur inotify libère le blocage.

Tom Hale
la source
Il y en a un autre, les montages en boucle: si vous montez un système de fichiers, puis montez un fichier sur ce système de fichiers à l'aide d'un montage en boucle, vous ne pourrez pas démonter le premier système de fichiers, mais rien ne s'affichera dans lsof.
Stephen Kitt
À votre santé. Ajouté à la Mountpointssection.
Tom Hale
5

Si vous utilisez GNOME, le démontage via Nautilus affichera un message indiquant quel processus utilise toujours le lecteur et le fichier utilisé.

texte alternatif

Tshepang
la source
1

Pour (au moins) OpenBSD:

$ fstat /mnt/mountpoint

Par exemple (utiliser doaspour exécuter en fstattant que root, sinon nous ne verrions que nos propres processus):

$ 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/

Dans ce cas, je ne pourrais pas démonter /usr/portsavant que l'utilisateur _pbuildn'ait fini d'exécuter ces deux makeprocessus.

Kusalananda
la source
-2

C'est un piège courant: vous appelez un utilisateur différent (root ou tout autre utilisateur), accédez au répertoire d'un périphérique monté, puis vous vous déconnectez en tant qu'utilisateur. Lorsque vous oubliez que vous êtes parti dans ce répertoire, vous pouvez essayer de trouver jusqu'à ce que vous soyez aveugle. lsofne montre au shell que le répertoire en cours utilise ce périphérique. Vous voudrez peut-être utiliser à nouveau cet utilisateur pour modifier votre répertoire.

Hans Linkels
la source
2
Cette réponse est incomplète ou incorrecte. Je ne sais pas lequel parce que ce n'est pas clair non plus.
Hildred