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?
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?
Antworten:
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.
fuser -mv /path/to/mountpointist möglicherweise eine besser lesbare Alternative, um Prozesse mithilfe eines Mointpoints herauszufinden.
lsof | grepfunktioniert besser für mich. fuser -mvscheint nur mehr als 80 verwandte Prozesse abzuspeichern. Ich verwende Mount-gebundene Verzeichnisse.
umount -list gefährlich . stattdessen mount -o bind ein modusleeres verzeichnis 000oben 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/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:
/foowenn /foo/bares sich um einen Bereitstellungspunkt handelt./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.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 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
-Mzur Sicherheit.
-Mangewendet 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 /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>
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 können erstellt werden durch:
openmit O_TMPFILE)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 diei_countVariable inkrementieren und dafür sorgen, dass die Variablev_os_hold valueerhöht bleibt, bis der inotify-Watcher den Hold freigibt.
lsof.
MountpointsAbschnitt hinzugefügt .
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.
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.