Manchmal möchte ich ein USB-Gerät mit aushängenumount /run/media/theDrive
, aber ich erhalte eine drive is busy
Fehlermeldung.
Wie finde ich heraus, welche Prozesse oder Programme auf das Gerät zugreifen?
Manchmal möchte ich ein USB-Gerät mit aushängenumount /run/media/theDrive
, aber ich erhalte eine drive is busy
Fehlermeldung.
Wie finde ich heraus, welche Prozesse oder Programme auf das Gerät zugreifen?
Antworten:
Verwenden Sie lsof | grep /media/whatever
, um herauszufinden, was die Halterung verwendet.
umount -l
Ziehen Sie auch (Lazy Umount) in Betracht , um zu verhindern, dass neue Prozesse das Laufwerk verwenden, während Sie bereinigen.
fuser -mv /path/to/mountpoint
ist möglicherweise eine besser lesbare Alternative, um Prozesse mithilfe eines Mointpoints herauszufinden.
lsof | grep
funktioniert besser für mich. fuser -mv
scheint nur mehr als 80 verwandte Prozesse abzuspeichern. Ich verwende Mount-gebundene Verzeichnisse.
umount -l
ist gefährlich . stattdessen mount -o bind
ein modusleeres verzeichnis 000
oben und aufräumen über lsof +f -- /dev/device
.
Die meiste Zeit, die beste Verwendung des Befehls ist lsof ( „ l i s t o Stift f iles“).
lsof +f -- /media/usb0
Wo /media/usb0
befindet 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/usb0
auch 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 lsof
muss).
Es gibt Verwendungen, die lsof nicht finden wird; Diese sind auf Wechselmedien ungewöhnlich. Sie beinhalten:
/foo
wenn /foo/bar
es sich um einen Bereitstellungspunkt handelt./foo
wenn /foo/bar
es 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.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
Sie können lsof
wie 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
-M
zur Sicherheit.
-M
angewendet werden soll.
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.
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 /mountpoint
ein Mountpunkt nach einem verschwindet umount -l
oder von einem überlagerten Mount ausgeblendet wird.
fuser
kann auch verwendet werden, aber meiner Meinung nach lsof
hat eine nützlichere Ausgabe. Dies fuser
ist 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>
Der Täter kann der Kernel selbst sein. Ein anderes Dateisystem, das auf dem Dateisystem installiert ist, das Sie versuchen, umount
verursacht 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 können erstellt werden durch:
open
mit O_TMPFILE
)Dies sind die am schwersten fassbaren Arten von Pokémon. Sie werden in lsof
der TYPE
Spalte als a_inode
(undokumentiert in der lsof
Manpage ) 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 diei_count
Variable inkrementieren und dafür sorgen, dass die Variablev_os_hold value
erhöht bleibt, bis der inotify-Watcher den Hold freigibt.
lsof
.
Mountpoints
Abschnitt hinzugefügt .
Für (mindestens) OpenBSD:
$ fstat /mnt/mountpoint
Zum Beispiel (mit als root doas
ausführen, fstat
da 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/ports
erst aufheben, wenn der Benutzer _pbuild
die Ausführung dieser beiden make
Prozesse beendet hat.
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. lsof
Zeigt 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.