Viele kennen das Problem, gerade bei USB-Speichergeräten, dass ein Programm oder Prozess das Aushängen eines Datenträgers verhindert denn nur ein Gerät was nicht in Benutzung ist kann auch ausgehängt werden. Dabei ist egal ob ein Dokument oder Datei offen ist oder ob man wie im anschließenden Fall nur das Verzeichnis in das es eingehängt wurde offen hat:
# umount /dev/sdb umount: /media/max/4335-1CEA: target is busy.
Wie ermittelt man nun den Übeltäter? Dabei können wir umständlich alle offenen Programme durchgehen oder als elegantere Variante den Befehl lsof nutzten. Wie bei allen ls-Befehlen wie lsusb, lspci oder ls steht „ls“ für list und das of steht für „open file“.
Der einfachste Aufruf wäre lsof <Gerätedatei>:
# lsof /dev/sdb lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc Output information may be incomplete. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2157 max cwd DIR 8,16 16384 1 /media/max/4335-1CEA bash 13159 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA lsof 14979 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA lsof 14980 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA
Hier wurde von dem Benutzer max ein USB-Stick unter KDE unter den Pfad /media/max/4335-1CEA eingehängt und der lsof-Befehl von root aufgerufen. Wie man sieht hat Benutzer max den Mountpoint in der Shell bash offen. Man kann auch statt der Gerätedatei den Mountpoint angeben. Das wäre für den obigen Fall:
# lsof /media/max/4335-1CEA/ lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc Output information may be incomplete. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2157 max cwd DIR 8,16 16384 1 /media/max/4335-1CEA bash 13159 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA lsof 15746 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA lsof 15747 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA
Wie man sieht ist das Resultat identisch. Da lsof ein sehr vielseitiger Befehl ist, dank dem *NIX-Motte alles ist ein file,besitzt der Befehl etliche Optionen von denen wir in diesem Zusammenhang nur wenige brauchen werden. Für den Fall, dass man keinen korrekten Mountpoint angegeben hat gibt es die Option +f die überprüft ob es sich bei dem angegebenen Pfad um ein Wurzelverzeichnis eines Datenträgers (=Mountpoint) handelt. Anderenfalls wird der Befehl mit entsprechder Fehlermeldungen abgebrochen.
pwd /media/max # lsof +f -- /media/max/ lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc Output information may be incomplete. lsof: not a file system: /media/max/ lsof 4.93.2 latest revision: https://github.com/lsof-org/lsof latest FAQ: https://github.com/lsof-org/lsof/blob/master/00FAQ latest (non-formatted) man page: https://github.com/lsof-org/lsof/blob/master/Lsof.8 usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]] [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s] [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names] Use the ``-h'' option to get more help information.
Das — verhindert das der angegebene Pfad nicht als Parameter interpretiert wird. Die vollständige Ausgabe von lsof +f — /media/max/4335-1CEA/ lautet nun:
# pwd /media/max/4335-1CEA # lsof +f -- /media/max/4335-1CEA/ lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc Output information may be incomplete. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2157 max cwd DIR 8,16 16384 1 /media/max/4335-1CEA bash 13159 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA lsof 20355 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA lsof 20356 root cwd DIR 8,16 16384 1 /media/max/4335-1CEA
Nun sehen wir mit Shellmitteln den Übeltäter der das Aushängen verhindert. Aber wie beendet man den Prozess? Weiter gehts im zweiten Teil.
1 Gedanke zu „Ein Prozess blockiert das Aushängen eines Datenträger (I) – lsof“
Kommentare sind geschlossen.