Wie man den fuser-Befehl unter Linux verwendet und optimal nutzt.
Angenommen, Du erhältst die Aufgabe die Prozesse zu identifizieren die eine bestimmte Datei verwenden und diese zu beenden – all dies muss von der Befehlszeile aus erfolgen. Was würdest du tun?
Befehlszeilenprofis werden wahrscheinlich eine Vorstellung davon haben, dass es unter Linux ein Befehlszeilenprogramm gibt, mit dem Sie Prozesse anhand der Dateien (oder Verzeichnisse oder Sockets) identifizieren können, auf die sie zugreifen. Nicht nur das, das Tool ermöglicht es Ihnen auch, diese Prozesse zu beenden, so dass Sie die Befehle kill oder killall nicht separat verwenden müssen. Das Befehlszeilenprogramm, von dem wir sprechen, ist fuser.
Wenn Du dieses Dienstprogramm noch nicht kennst und verstehen möchtest, dann findest Du in diesem Artikel einige leicht verständliche Beispiele.
Linux fuser Befehl
Der Befehl fuser – wie ich bereits oben erwähnt habe – wird in erster Linie verwendet, um Prozesse zu identifizieren, die Dateien, Verzeichnisse oder Sockets verwenden. Das Tool zeigt im Wesentlichen die PIDs von Prozessen an, die die Datei verwenden, deren Name als Argument an den Befehl übergeben wird.
Hier ist der Befehl fuser in seiner einfachsten Form in Aktion:
Wie aus dem Screenshot oben ersichtlich, haben wir versucht, mit fuser herauszufinden, welche Prozesse das Verzeichnis /home/himanshu verwenden, und der Befehl – in seiner Ausgabe – erzeugte eine Liste von Prozess-IDs. So weit so gut, aber es gibt hier ein paar Probleme.
Erstens, was ist das „c“, das an jede PID angehängt wird? Ein kurzer Blick auf die Man Page des Befehls zeigt, dass der Befehl fuser im Standardanzeigemodus nicht nur die PIDs der Prozesse anzeigt, die auf die Datei oder das Verzeichnis zugreifen, sondern auch die Art des Zugriffs.
Jede Art von Zugriff wird durch einen Buchstaben gekennzeichnet:
- c – aktuelles Verzeichnis.
- e – ausführbare Datei wird ausgeführt.
- f – Datei öffnen. f entfällt im Standardanzeigemodus.
- F – Datei zum Schreiben öffnen. Im Standardanzeigemodus entfällt F.
- r – Stammverzeichnis.
- m – mmap’ed Datei oder gemeinsame Bibliothek.
Nun, um auf das Beispiel zurückzukommen, das wir besprochen haben, zeigt der Buchstabe ‚c‘ in der Ausgabe an, dass alle Prozesse, deren PIDs in der Ausgabe aufgelistet sind, auf das Verzeichnis /home/himanshu als ihr aktuelles Verzeichnis zugreifen.
Beachten Sie, dass ein Prozess mehrere Arten von Zugriffen auf eine Datei oder ein Verzeichnis haben kann. Die folgende Ausgabe zeigt beispielsweise, dass viele Prozesse auf das Stammverzeichnis (/) zugreifen, und zwar sowohl auf das aktuelle als auch auf das Stammverzeichnis.
Bisher enthielt die Fixierausgabe, die wir sehen, nur Prozess-IDs und nicht mehr als das. Wäre es nicht besser, wenn auch die Prozessnamen angezeigt werden? Nun, dafür musst du die Kommandozeilenoption -v verwenden. Nachfolgend ein Beispiel:
Um den Benutzernamen des Prozessverantwortlichen an jede PID anzuhängen, verwenden Sie die Befehlszeilenoption -u. Hier ist ein Beispiel dafür:
Hinweis: Wenn sich die betreffende Datei oder das betreffende Verzeichnis auf einem gemounteten Dateisystem oder einem Blockgerät befindet, verwenden Sie die Befehlszeilenoption -m. „Alle Prozesse, die auf Dateien in diesem Dateisystem zugreifen, werden aufgelistet“, heißt es auf der Manpage. „Wenn eine Verzeichnisdatei angegeben wird, wird sie automatisch auf NAME/. geändert, um jedes Dateisystem zu verwenden, das in diesem Verzeichnis eingebunden sein könnte.“
Wie man Prozesse mit Hilfe von fuser killt
Nun, da wir die Grundlagen der Fixiereinheit besprochen haben, kommen wir zu der Aufgabe, die ich am Anfang erwähnt habe – wie kann man Prozesse mit der Fixiereinheit beenden? Nehmen wir ein einfacheres Beispiel für diesen Fall. Was ich tun werde, ist, eine ausführbare Datei auszuführen, und während sie läuft, werde ich versuchen, den Prozess mit fuser zu beenden.
Hier ist also die ausführbare Datei, die gestartet wurde:
Und hier ist der fuser-Befehl, der den Prozess, der von der ausführbaren test-fuser-Datei initiiert wurde, im Idealfall beenden sollte.
fuser -v -k test-fuser
Oh, bevor ich mit der Ausführung dieses Befehls beginne, möchte ich Ihnen sagen, dass die Befehlszeilenoption -k fuser anweist, den Prozess (oder die Prozesse) über die Datei oder das Verzeichnis zu beenden.
Hier ist, was passiert ist, wenn der oben genannte Befehl ausgeführt wurde:
Wie aus dem obigen Screenshot ersichtlich, hat die Verwendung der Befehlszeilenoption -k mit fuser den Test-Fixierprozess beendet. Um sicherzustellen, dass der Befehl fuser nach der Bestätigung durch den Benutzer fragt, bevor ein Prozess beendet wird, verwenden Sie die Option -i. Siehe Beispiel unten:
Im Folgenden finden Sie ein paar wichtige Details zu Fixierern, die Sie bei der Verwendung der Option -k kennen sollten:
- Mit -k sendet der Befehl fuser standardmäßig das SIGKILL-Signal. Sie können dieses Verhalten jedoch mit der Option -SIGNAL ändern.
- Ein Fixierprozess tötet sich nie selbst, sondern kann andere Fixierprozesse töten.
fuser – andere Details
Neben den bisher genannten Informationen gibt es noch einige weitere Details, die es wert sind, beachtet zu werden. Auf alle diese Informationen kann über die Manpage des Befehls zugegriffen werden. Im Folgenden finden Sie beispielsweise die Informationen, die die Man Page fuser im Abschnitt’Restriktionen‘ aufführt:
Processes accessing the same file or file system several times in the same way are only shown once.
If the same object is specified several times on the command line, some
of those entries may be ignored.
fuser may only be able to gather partial information unless run with
privileges. As a consequence, files opened by processes belonging to
other users may not be listed and executables may be classified as
mapped only.
Installing fuser SUID root will avoid problems associated with partial
information, but may be undesirable for security and privacy reasons.
udp and tcp name spaces, and UNIX domain sockets can’t be searched with
kernels older than 1.3.78.
Accesses by the kernel are only shown with the -v option.
The -k option only works on processes. If the user is the kernel,
fuser will print an advice, but take no action beyond that.
Fazit
Wie Sie inzwischen verstanden haben, ist fuser ein äußerst nützliches Befehlszeilenprogramm unter Linux. Das Gute daran ist, dass das Tool weder schwer zu verstehen noch zu benutzen ist, so dass selbst Anfänger leicht damit anfangen können. Ein Aspekt, den wir hier nicht angesprochen haben, ist, dass der Befehl es Ihnen ermöglicht, Prozesse zu identifizieren und sogar zu beenden, die auf bestimmten Ports laufen, was ihn auch für Netzwerkadministratoren zu einem schwer zu ignorierenden Werkzeug macht.