Ein Prozess blockiert das Aushängen eines Datenträger (II) – fuser

Im ersten Teil wurden Prozesse identifiziert die das Aushängen eines Datenträgers verhindern aber wir haben immer noch keinen Zustand in dem ein Datenträger ausgehängt werden kann. Natürlich kann man ein z.B. evtl. offenes Office-Dokument abspeichern und das Officeprogramm beenden und das empfiehlt sich auch wenn man keinen Datenverlust riskieren möchte. Aber man kann auch die Prozesse hart beenden wenn kein Datenverlust droht. So ein Beispiel wäre z.B. wenn xpdf das Aushängen verhindert.:

# 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
xpdf.real 23765 max cwd DIR 8,32 16384 12180 /media/max/4335-1CEA/Download
xpdf.real 23765 max 4r REG 8,32 3262888 12533 /media/max/4335-1CEA/Download/FujiFilm F20 Bedienungsanleitung

Hier ist eine PDF-Datei von xpdf geöffnet.

Ein verwandter Befehl zu lsof ist fuser. fuser kann Prozesse identifizieren die Dateien, Verzeichnisse und Sockets verwenden. Ein einfacher Aufruf würde z.B. zu so einer Ausgabe führen:

# fuser /media/max/4335-1CEA/
/media/max/4335-1CEA: 13159c 24928c 24943c

Ausgegeben werden hier die PIDs der Prozesse die eine Datei offen haben und hinter der PID wird noch ein Buchstabe angezeigt die folgende Bedeutung haben:

  • C – aktuelles Verzeichnis
  • e – ausführbare Datei wird ausgeführt
  • r – Stammverzeichnis

Weitere Bedeutungen findet man in der Manpage von fuser.

Wie bei vielen Befehlen besitzt fuser auch eine Menge an Optionen. Eine Einfach und nützliche Option von fuser ist -v denn nun wird auch der Prozessname ausgegeben die eine Datei benutzt.

# fuser -v /media/max/4335-1CEA/
BEN. PID ZUGR. BEFEHL
/media/max/4335-1CEA:
root kernel mount /media/max/4335-1CEA
root 13159 ..c.. bash
max 24928 ..c.. oosplash
max 24943 ..c.. soffice.bin

Mit der Option -u kann hier der Benutzer ermittelt werden der die Datei blockiert:

# fuser -vu /media/max/4335-1CEA/
BEN. PID ZUGR. BEFEHL
/media/max/4335-1CEA:
root kernel mount (root)/media/kai/4335-1CEA
root 13159 ..c.. (root)bash
max 24928 ..c.. (max)oosplash
max 24943 ..c.. (max)soffice.bin

Falls sich die Datei auf einem gemountetem Dateisystem oder Blockdevice befindet empfielt es sich die Option -m zu verwenden. Dabei werden alle Prozesse angezeigt die auf Dateien auf diesem Dateisystem zugreifen.

# fuser -vum /tmp
BEN. PID ZUGR. BEFEHL
/tmp: root kernel mount (root)/tmp
max 2037 F.... (max)mysqld
max 24943 F.... (max)soffice.bin

Nun kommen wir, nachdem die Funktionsweise von fuser erläutert wurde, zum Beenden von störenden Prozessen. Zur Demonstration kann man in ein kurzes Shellscript schreiben mit dem Inhalt:

#!/bin/bash
sleep 10000

und unter warten.sh abspeichern und mit chmod +x warten.sh ausführbar machen. Das Script macht nichts anderes als 10000 Sekunden einfach anzuhalten und diese Zeit mit einer PID versehen unter dem Namen „warten.sh“ als Prozess zu laufen. Gestartet wird es aus dem Verzeichnis in dem es abgespeichert wurde mit ./warten.sh & oder bash warten.sh &. Das Zeichen & hinter dem Scriptaufruf schickt das Script in den Hintergrund und gibt die Shell wieder frei. Näheres zu Hintergrund/Vordergrund-Prozessen usw. findet man in „Die Konsole für Dummies (Teil I)“.

Das Script blockiert zwar selber nicht, wie im Titel geschrieben, ein Laufwerk und verhindert so das Aushängen aber es kann gut gezeigt werden wenn es auf einem gemounteten Laufwerk gespeichert wurde und gestartet wurde weil es als laufender Prozess das Aushängen blockiert obwohl es im Grunde genommen nichts tut.

mount -t auto /dev/sdd /mnt
cd /mnt
/mnt# ./warten.sh &
[1] 76630
/mnt# jobs
[1]+ Läuft ./warten.sh &
/mnt# cd ..
/# umount /dev/sdd
umount: /mnt: target is busy.

Als Mountpoint für /dev/sdd ist zur Zeit /mnt/ ein Rootverzeichnis eines gemountenden Datenträgers. Da das Script auf dem Datenträger läuft wird das Aushängen selbigen blockiert.

Den Prozess der jetzt den Datenträger blockiert kann man mit fuser -kivm -TERM <montpoint>  beenden.

# fuser -kivm -TERM /mnt
BEN. PID ZUGR. BEFEHL
/mnt: root kernel mount /mnt
root 3634 f.c.. warten.sh
root 3635 ..c.. sleep
Prozess 3634 abbrechen? (y/N) y
Prozess 3635 abbrechen? (y/N) y
[1]+ Beendet ./warten.sh (Verz.: /mnt)
(gegenwärtiges Arbeitsverzeichnis ist: /)

Die Optionen im Einzelnen: -k steht für kill,  -i für Interaktiv, d.h. es wird vor dem Beenden nachgefragt, -v steht für verbose und dadurch werden mehr Informationen ausgegeben und -m erklärt fuser, dass es sich bei dem Pfad um einen Mountpoint handelt. Nun sind alle blockierenden Prozesse beendet und das Laufwerk kann ausgehangen werden.

1 Gedanke zu „Ein Prozess blockiert das Aushängen eines Datenträger (II) – fuser“

Kommentare sind geschlossen.

kais-universum.de