Comment savoir quels process empêchent le déassembly d'un appareil?

Parfois, je voudrais démonter un périphérique USB , mais je reçois un drive is busy erreur drive is busy .

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

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

En outre, considérez umount -l (paresseux) pour empêcher de nouveaux process d'utiliser le lecteur pendant le nettoyage.

La plupart du time, la meilleure command à utiliser est lsof ("il y a des fills ").

 lsof +f -- /media/usb0 

/media/usb0 est le sharepoint assembly du lecteur USB ou d'un autre système de files à démonter. +f -- indique à lsof de traiter l'argument suivant comme un sharepoint assembly; il habituellement, mais pas toujours, gère seul, de sorte que lsof /media/usb0 fonctionne également. Cela permet de find des files ouverts (même non liés), des files mappés en memory, des directorys courants et des utilisations plus obscures. Vous devrez exécuter la command en tant que root pour get des informations sur les process des autres users (et je pense qu'il y a des unices où lsof doit être exécuté en tant que root).

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

  • points de assembly: vous ne pouvez pas démonter /foo si /foo/bar est un sharepoint assembly.
  • mount devices: vous ne pouvez pas démonter /foo si /foo/bar est un périphérique de bloc monté ou un file régulier monté en boucle ou s'il est la source d'un assembly de binding Linux.
  • Export NFS: lsof ne détectera pas qu'une arborescence est exscope par un server NFS du kernel.

Une autre command qui peut servir dans une pincée est fuser, qui ne répertorie que les PID de process avec des files ouverts sur le périphérique:

 fuser -m /media/usb0 

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

 fuser -k /mnt/path umount /mnt/path 

Si vous utilisez GNOME, le déassembly via Nautilus affichera un message indiquant quel process utilise toujours le lecteur et le file qu'il utilise.

alt texte

Pour (au less) OpenBSD:

 $ fstat /mnt/mountpoint 

Par exemple (en utilisant doas pour exécuter fstat tant que root car autrement nous fstat nos propres process):

 $ 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 serais pas capable de démonter /usr/ports jusqu'à ce que l'user _pbuild ait fini d'exécuter ces deux process make .

Ouvrir les files

Les process avec des files ouverts sont les coupables habituels. Affichez-les:

 lsof +f -- <mountpoint or device> 

Il y a un avantage à utiliser /dev/<device> plutôt que /mountpoint : un sharepoint assembly disparaîtra après un umount -l , ou il sera masqué par un assembly superposé.

fuser peut également être utilisée, mais à mon avis, lsof a un résultat plus utile. Cependant, l' fuser est utile quand il s'agit de tuer les process causant vos drames afin que vous puissiez continuer votre vie.

Liste des files sur <mountpoint> (voir ci-dessus):

 fuser -vmM <mountpoint> 

Ne tue de manière interactive que les process dont les files sont ouverts à l'écriture:

 fuser -vmMkiw <mountpoint> 

Après avoir remonté en lecture seule ( mount -o remount,ro <mountpoint> ), il est sûr (r) de tuer tous les process restants:

 fuser -vmMk <mountpoint> 

Mountpoints

Le coupable peut être le kernel lui-même. Un autre système de files monté sur le système de files que vous tentez de umount entraînera un chagrin. Vérifier avec:

 mount | grep <mountpoint>/ 

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

 losetup -la 

Les inodes anonymes (Linux)

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

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

Il s'agit du type de pokemon le plus insaisissable, et apparaît dans la colonne TYPE de a_inode sous la forme a_inode (qui n'est pas documentée dans la page de manuel lsof ).

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

 lsof | grep a_inode 

Pour tuer les process contenant des inodes anonymes, voir: Liste des montres inotify actuelles (nom de path, PID) .

inotify montres (Linux)

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

un déassembly peut se bloquer dans l'appel vx_softcnt_flush() . Le blocage se produit car les montres inotify incrémentent la variable i_count et font en v_os_hold value rest élevée jusqu'à ce que l'observateur inotify libère la mise en attente.

C'est un piège commun: vous su su à un user différent (root ou tout autre user), changez dans le directory d'un périphérique monté, puis déconnectez-vous en tant qu'user. Lorsque vous oubliez que vous êtes parti dans ce directory, vous pouvez essayer de find jusqu'à ce que vous soyez aveugle. lsof affiche le shell dans lequel le directory actuel utilise ce périphérique. Vous voudrez peut-être requestr à nouveau à cet user de modifier votre directory.