web-dev-qa-db-fra.com

Comment savoir quel processus empêche un umount?

Quand je fais

Sudo umount /media/Kingston

J'ai eu

umount: /media/Kingston: device is busy.

Je ferme toutes les fenêtres et m'assure que tous les Shell pointent vers d'autres répertoires. Comment puis-je trouver quel processus empêche l'umount?

26
Guillaume Coté

ouvrir un terminal:

fuser -c /media/Kingston

Il va sortir quelque chose comme ça:

/media/Kingston/: 3106c 11086

Cela vous donnera le pid des processus utilisant ce volume. Le caractère supplémentaire à la fin de pid donnera des informations supplémentaires. (c en 3106c)

c - le processus utilise le fichier comme répertoire de travail actuel
m - le fichier est mappé avec mmap
o - le processus l'utilise comme un fichier ouvert
r - le fichier est le répertoire racine du processus
t - le processus accède au fichier en tant que fichier texte
y - ce fichier est le terminal de contrôle du processus

Donc, pour démonter il suffit de tuer ce pids et réessayer le démonter

Sudo kill -9 3106 11086
Sudo umount /media/Kingston

Remarque: pour trouver le nom d'application exact de ces pids, vous pouvez utiliser cette commande

cat /proc/<pid>/cmdline

Par exemple: cat /proc/11086/cmdline

cela produira quelque chose comme ci-dessous.

    evince^@/media/Kingston/Ubuntu-guide.pdf^@

J'espère que cela aidera

24
aneeshep

L’outil le plus utile est lsof Install lsof . Il montre quels fichiers sont utilisés par quels processus. Si /media/Kingston est un point de montage (le nom de périphérique fonctionnerait également), la commande suivante affiche tous les fichiers en cours d'utilisation sur ce point de montage:

lsof /media/Kingston

Si vous exécutez cette commande en tant qu'utilisateur ordinaire, elle ne montrera que vos propres processus¹. Exécutez Sudo lsof /media/Kingston pour voir tous les processus des utilisateurs.

La sortie de lsofse présente comme suit:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
zsh4    31421 gilles  cwd    DIR    8,1     4096 130498 /var/tmp
zsh4    31421 gilles  txt    REG    8,1   550804 821292 /bin/zsh4
zsh4    31421 gilles  mem    REG    8,1    55176 821326 /usr/lib/zsh/4.3.10/zsh/complist.so
zsh4    31421 gilles   12r   REG    8,1   175224 822276 /usr/share/zsh/functions/Completion.zwc

La colonne COMMANDindique le nom de l'exécutable du programme et la colonne PIDindique l'ID du processus. La colonne NAMEindique le nom du fichier; (deleted) peut s'afficher si le fichier a été supprimé en cours d'ouverture (lorsqu'un fichier est supprimé, il n'a plus de nom, mais il existe toujours jusqu'à ce que le dernier processus l'utilisant ferme le fichier). USERdevrait être explicite. Les autres colonnes n'ont pas d'importance ici, à l'exception peut-être de FDname__, qui montre comment le fichier est utilisé par le processus:

  • cwdname__: répertoire de travail en cours
  • txtname__: l'exécutable du programme²
  • memname__: un fichier mappé en mémoire (ici, considérez-le comme un fichier ouvert)
  • un numéro: un fichier réellement ouvert; une lettre suivante indique le mode d'ouverture, tel que ren lecture et wen écriture

Il n’existe aucun moyen mécanique de localiser la fenêtre dans laquelle un fichier est ouvert (ceci n’a en fait pas de sens technique: si un processus a plusieurs fenêtres, un fichier n’est pas particulièrement associé à une fenêtre ou à une autre), ni même un moyen simple d’identifier un fichier. la fenêtre d'un processus (et bien sûr, un processus n'a pas nécessairement de fenêtre). Mais généralement, le nom de la commande et le nom du fichier suffisent à localiser le contrevenant et à fermer le fichier correctement.

Si vous ne pouvez pas fermer le fichier et que vous voulez simplement tout arrêter, vous pouvez tuer le processus avec kill 31421 (où 31421 est l'ID du processus) ou kill -HUP 31421 ("raccrocher"). Si le meurtre simple ne fait pas l'affaire, tuez avec un préjudice extrême: kill -KILL 31421.

Il existe une interface utilisateur graphique pour lsof, glsof , mais elle n'est pas encore prête pour les heures de grande écoute et n'est pas intégrée à Ubuntu pour l'instant.

¹ Lsof peut répertorier des informations sur les processus d'autres utilisateurs, mais il ne détecte pas le point de montage, il ne les répertoriera donc pas si vous spécifiez un point de montage.
² Le code exécutable est souvent appelé texte dans les discussions sur les formats exécutables.

7
Gilles

Cela peut aussi aider:

lsof | grep \/media\/Kingston
2
Hashem Masoud

Pendant ce temps, la commande de fusion s’est beaucoup améliorée. Vous pouvez faire le travail complet avec une seule commande:

$ Sudo fuser -ickv /"mountpoint"

Où:

  • le paramètre k supprime le processus incriminé,
  • alors que v montre à l’avance le processus et son utilisateur
  • et i vous demande une confirmation.

Si certains processus résistent, essayez à nouveau avec fuser -ickv -9 (ou plus généralement avec -SIGNAL) qui tue les processus les plus obstinés.
Mais vous trouverez toujours un procédé "immortel" ...!

Dans ce cas, j'ai récemment appris à utiliser

$ Sudo umount --lazy --force <mountpoint>

en tant que dernière ressource, cela a jusqu'à présent fonctionné pour moi à chaque fois.

2
prometheos