Wie finde ich heraus, welche Prozesse das Abmelden eines Geräts verhindern?

58

Manchmal möchte ich ein USB-Gerät mit aushängenumount /run/media/theDrive , aber ich erhalte eine drive is busyFehlermeldung.

Wie finde ich heraus, welche Prozesse oder Programme auf das Gerät zugreifen?

Stefan
quelle
1
Weitere Upvotes für die gleiche Frage / Antwort gibt es hier: stackoverflow.com/questions/624154/…
Trevor Boyd Smith

Antworten:

57

Verwenden Sie lsof | grep /media/whatever, um herauszufinden, was die Halterung verwendet.

umount -lZiehen Sie auch (Lazy Umount) in Betracht , um zu verhindern, dass neue Prozesse das Laufwerk verwenden, während Sie bereinigen.

Peter Eisentraut
quelle
24
fuser -mv /path/to/mountpointist möglicherweise eine besser lesbare Alternative, um Prozesse mithilfe eines Mointpoints herauszufinden.
Riccardo Murri
@ RiccardoMurri lsof | grepfunktioniert besser für mich. fuser -mvscheint nur mehr als 80 verwandte Prozesse abzuspeichern. Ich verwende Mount-gebundene Verzeichnisse.
Ricky Boyce
1
umount -list gefährlich . stattdessen mount -o bind ein modusleeres verzeichnis 000oben und aufräumen über lsof +f -- /dev/device.
Tom Hale
35

Die meiste Zeit, die beste Verwendung des Befehls ist lsof ( „ l i s t o Stift f iles“).

lsof +f -- /media/usb0

Wo /media/usb0befindet sich der Einhängepunkt des USB-Laufwerks oder eines anderen Dateisystems, dessen Einhängung aufgehoben werden soll? +f --weist lsof an, das nachfolgende Argument als Mount-Punkt zu behandeln; es schafft normalerweise, aber nicht immer, von selbst, so dass es lsof /media/usb0auch funktioniert. Hiermit werden offene Dateien (auch nicht verknüpfte), Speicherzuordnungsdateien, aktuelle Verzeichnisse und weitere unklare Verwendungen gefunden. Sie müssen den Befehl als root ausführen, um Informationen zu den Prozessen anderer Benutzer zu erhalten (und ich denke, es gibt Unices, bei denen der Befehl als root ausgeführt werden lsofmuss).

Es gibt Verwendungen, die lsof nicht finden wird; Diese sind auf Wechselmedien ungewöhnlich. Sie beinhalten:

  • Bereitstellungspunkte: Sie können die Bereitstellung nicht aufheben, /foowenn /foo/bares sich um einen Bereitstellungspunkt handelt.
  • Mount-Geräte: Sie können das Mounten nicht aufheben, /foowenn /foo/bares sich um ein gemountetes Block-Gerät oder eine durch eine Schleife gemountete reguläre Datei handelt oder wenn es sich um die Quelle eines Linux-Bind-Mounts handelt.
  • NFS-Export: lsof erkennt nicht, dass ein Baum von einem Kernel-NFS-Server exportiert wird.

Ein weiterer Befehl, der zur Not verwendet werden kann, ist fuser, das nur PIDs von Prozessen mit geöffneten Dateien auf dem Gerät auflistet:

fuser -m /media/usb0
Gilles 'SO - hör auf böse zu sein'
quelle
8

Sie können lsofwie Peter gesagt verwenden, oder, wenn Sie sicher sind, dass Sie nur all diese Dinge töten und aushängen möchten, können Sie wahrscheinlich Folgendes tun:

fuser -Mk /mnt/path
umount /mnt/path
Pioto
quelle
1
Wenn Sie dies tun, prüfen Sie die Verwendung -Mzur Sicherheit.
Tom Hale
@TomHale Möglicherweise möchten Sie klarstellen, auf welchen Befehl -Mangewendet werden soll.
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

Dateien öffnen

Prozesse mit offenen Dateien sind die üblichen Schuldigen. Zeigen Sie sie an:

lsof +f -- <mountpoint or device>

Die Verwendung von /dev/<device>anstelle von hat den Vorteil, dass /mountpointein Mountpunkt nach einem verschwindet umount -loder von einem überlagerten Mount ausgeblendet wird.

fuserkann auch verwendet werden, aber meiner Meinung nach lsofhat eine nützlichere Ausgabe. Dies fuserist jedoch hilfreich, wenn es darum geht, die Prozesse zu beenden, die Ihre Dramen verursachen, damit Sie mit Ihrem Leben weitermachen können.

Dateien <mountpoint>auflisten (siehe Warnung oben):

fuser -vmM <mountpoint>

Beenden Sie interaktiv nur Prozesse mit Dateien, die zum Schreiben geöffnet sind:

fuser -vmMkiw <mountpoint>

Nach dem erneuten Einhängen von read-only ( mount -o remount,ro <mountpoint>) ist es sicher (r), alle verbleibenden Prozesse abzubrechen:

fuser -vmMk <mountpoint>

Mountpoints

Der Täter kann der Kernel selbst sein. Ein anderes Dateisystem, das auf dem Dateisystem installiert ist, das Sie versuchen, umountverursacht Trauer. Erkundigen Sie sich bei:

mount | grep <mountpoint>/

Überprüfen Sie für Loopback-Mounts ( danke Stephen Kitt ) auch die Ausgabe von:

losetup -la

Anonyme Inodes (Linux)

Anonyme Inodes können erstellt werden durch:

  • Temporäre Dateien ( openmit O_TMPFILE)
  • Uhren inotifizieren
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Dies sind die am schwersten fassbaren Arten von Pokémon. Sie werden in lsofder TYPESpalte als a_inode(undokumentiert in der lsofManpage ) angezeigt .

Sie werden nicht in angezeigt lsof +f -- /dev/<device>, daher müssen Sie:

lsof | grep a_inode

Informationen zum Beenden von Prozessen mit anonymen Inodes finden Sie unter: Auflisten der aktuellen Inotify-Überwachungen (Pfadname, PID) .

inotify Uhren (Linux)

In diesem Kommentar wird erläutert, warum inotify das Aufheben der Bereitstellung nicht verhindert werden sollte. In diesem Hinweis werden jedoch die Situationen beschrieben, in denen Folgendes ausgeführt wird :

Ein Unmount kann im vx_softcnt_flush()Anruf hängen bleiben . Der Hang tritt auf, weil inotify-Watches die i_countVariable inkrementieren und dafür sorgen, dass die Variable v_os_hold valueerhöht bleibt, bis der inotify-Watcher den Hold freigibt.

Tom Hale
quelle
Es gibt noch eine andere Möglichkeit, das Mounten von Loopbacks: Wenn Sie ein Dateisystem mounten und dann eine Datei auf diesem Dateisystem mit einem Loopback-Mount mounten, können Sie das erste Dateisystem nicht abmounten, es wird jedoch nichts in angezeigt lsof.
Stephen Kitt
Prost. Zum MountpointsAbschnitt hinzugefügt .
Tom Hale
5

Wenn Sie GNOME verwenden, wird beim Aufheben der Bereitstellung über Nautilus eine Meldung angezeigt, die angibt, welcher Prozess das Laufwerk noch verwendet und welche Datei es verwendet.

Alt-Text

Tshepang
quelle
1

Für (mindestens) OpenBSD:

$ fstat /mnt/mountpoint

Zum Beispiel (mit als root doasausführen, fstatda wir sonst nur unsere eigenen Prozesse sehen würden):

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

In diesem Fall kann ich die Bereitstellung /usr/portserst aufheben, wenn der Benutzer _pbuilddie Ausführung dieser beiden makeProzesse beendet hat.

Kusalananda
quelle
-2

Dies ist eine häufige Gefahr: Sie müssen sich bei einem anderen Benutzer (entweder root oder einem anderen Benutzer) anmelden, in das Verzeichnis eines gemounteten Geräts wechseln und sich dann als dieser Benutzer abmelden. Wenn Sie vergessen, dass Sie in diesem Verzeichnis gelassen haben, können Sie versuchen, zu suchen, bis Sie blind sind. lsofZeigt der Shell an, welches aktuelle Verzeichnis dieses Gerät verwendet. Möglicherweise möchten Sie als dieser Benutzer erneut su, um Ihr Verzeichnis zu ändern.

Hans Linkels
quelle
2
Diese Antwort ist entweder unvollständig oder falsch. Ich bin mir nicht sicher welches, weil es auch unklar ist.
Hildred