Die Symlinks sind unter Linux quasi universell, existieren aber nirgendwo anders (außer bei Cygwin, das sie emuliert). gibt es auch unter AIX und Solaris, aber keine Symlinks. Portabel, um Informationen zu geöffneten Dateien zu erhalten, installieren Sie ./proc/PID/fd/NUM
/proc/PID/fd/NUM
lsof
Unices mit /proc/PID/fd
Unter Linux befindet sich ein leicht magischer symbolischer Link zu der Datei, die der Prozess mit der ID PID im Dateideskriptor NUM geöffnet hat . Dieser Link ist insofern magisch, als er beispielsweise verwendet werden kann, um auf die Datei zuzugreifen, selbst wenn die Datei entfernt wird. Der Link verfolgt die Datei auch durch Umbenennen. ist eine magische symbolische Verknüpfung, die darauf hinweist, wo PID der Prozess ist, der auf die Verknüpfung zugreift./proc/PID/fd/NUM
/proc/self
/proc/PID
Diese Funktion ist auf nahezu allen Linux-Systemen verfügbar. Es wird vom Treiber für das Proc-Dateisystem bereitgestellt , das technisch optional ist, aber für so viele Dinge (einschließlich der ps
Arbeit, aus der es liest ) verwendet wird, dass es selbst auf eingebetteten Systemen fast nie ausgelassen wird./proc/PID
Cygwin
Cygwin emuliert Linux (für Cygwin-Prozesse) und ./proc/PID/fd/NUM
/proc/self
Solaris (seit Version 2.6), AIX
Für jeden Dateideskriptor sind Einträge vorhanden, die jedoch denselben Typ wie die geöffnete Datei haben und daher keine Informationen zum Pfad der Datei enthalten. Sie melden jedoch dieselben Informationen wie an den Prozess, bei dem die Datei geöffnet ist. Sie können also feststellen, auf welchem Dateisystem sich die Datei befindet und welche Inode-Nummer sie hat. Verzeichnisse werden als symbolische Links angezeigt, es handelt sich jedoch um magische Symlinks, denen nur gefolgt werden kann. Sie geben eine leere Zeichenfolge zurück./proc/PID/fd
stat
fstat
readlink
Unter AIX zeigt der procfiles
Befehl einige Informationen zu den geöffneten Dateien eines Prozesses an. Unter Solaris zeigt der pfiles
Befehl einige Informationen zu den geöffneten Dateien eines Prozesses an. Dies beinhaltet nicht den Pfad zur Datei (unter Solaris seit Solaris 10, siehe unten).
Zusätzlich haben moderne Solaris-Versionen symbolische Links, die den Symlinks in Linux ähneln . Der Befehl zeigt Informationen zu den geöffneten Dateien eines Prozesses an, einschließlich der Pfade./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
ist eine Textdatei, die einen Datensatz (eine Zeile) pro Dateideskriptor enthält, der vom Prozess geöffnet wird. Der Dateiname wird dort nicht nachverfolgt.
/proc/PID/
ist ein Verzeichnis, das jedoch keine Informationen zu Dateideskriptoren enthält.
Unices /proc
ohne direkten Zugriff auf Dateideskriptoren
(Hinweis: Manchmal ist es möglich, Informationen über die geöffneten Dateien eines Prozesses zu erhalten, indem Sie das Speicherabbild durchsuchen, auf das unter zugegriffen werden kann /proc
. Ich zähle das nicht als „direkten Zugriff“.)
Unices wo ist eine Datei/proc/PID
Das proc-Dateisystem selbst startete in der 8. Edition von UNIX, hatte jedoch eine andere Struktur und durchlief Plan 9 und einige Unices. Ich denke, dass alle Betriebssysteme mit einem /proc
Eintrag für jede PID haben, aber auf vielen Systemen ist es eine reguläre Datei, kein Verzeichnis. Folgende Systeme haben ein , mit dem gelesen werden muss :/proc/PID
ioctl
MINIX 3 verfügt über einen procfs-Server, der verschiedene Linux-ähnliche Komponenten einschließlich Verzeichnissen bereitstellt . Das gibt es aber nicht ./proc/PID/
/proc/PID/fd
FreeBSD verfügt über Verzeichnisse, die jedoch keine Informationen zu offenen Dateideskriptoren enthalten. (Es gibt jedoch Linux-ähnliche Programme , die über einen symbolischen Link Zugriff auf die ausführbare Datei gewähren.)/proc/PID/
/proc/PID/file
/proc/PID/exe
FreeBSDs procfs ist veraltet .
Unices ohne /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Dateideskriptorinformationen über andere Kanäle
Der fuser
Befehl listet die Prozesse auf, für die eine angegebene Datei oder eine Datei auf dem angegebenen Einhängepunkt geöffnet ist. Dieser Befehl ist Standard (verfügbar auf allen XSI- kompatiblen Systemen, dh POSIX mit der X / Open-Systemschnittstellenerweiterung).
Mit diesem Dienstprogramm können Sie nicht von einem Prozess zu Dateinamen wechseln.
Lsof steht für "list open files". Es ist ein Drittanbieter-Tool , das für die meisten Unix-Varianten verfügbar ist (aber normalerweise nicht Teil der Standardinstallation ist). Das Abrufen von Informationen zu geöffneten Dateien ist sehr systemabhängig, da Sie aufgrund der obigen Analyse möglicherweise den Verdacht hatten. Der lsof-Betreuer hat die Arbeit gemacht, alles unter einer einzigen Schnittstelle zu kombinieren.
Sie können die FAQ lesen, um zu sehen, mit welchen Schwierigkeiten sich lsof abfinden muss. Bei den meisten Unices ist zum Abrufen von Informationen über die Namen der geöffneten Dateien das Analysieren von Kerneldatenstrukturen erforderlich. Zitat aus FAQ 3.3 „Warum werden keine vollständigen Pfadnamen gemeldet?“:
Lsof kann keine Pfadnamenskomponenten aus den Kernel-Namenscaches der folgenden Dialekte abrufen:
Nur der Linux-Kernel zeichnet vollständige Pfadnamen in den Strukturen auf, die er für geöffnete Dateien verwaltet. Stattdessen konvertieren die meisten Kernel Pfadnamen in Geräte- und Knotennummern-Doublets und verwenden sie nach dem Öffnen von Dateien für nachfolgende Dateiverweise.
Wenn Sie Informationen aus lsof
der Ausgabe analysieren müssen, verwenden Sie unbedingt den -F
Modus (ein Feld pro Zeile), vorzugsweise den -F0
Modus (durch Nullen getrennte Felder). Um Informationen über einen bestimmten Dateideskriptor eines bestimmten Prozesses zu erhalten, verwenden Sie die -a
Option mit und , z .-p PID
-d NUM
lsof -a -p 123 -d 0 -F0n
/dev/fd/NUM
für Dateideskriptoren des aktuellen Prozesses
Viele Unix-Varianten bieten einem Prozess die Möglichkeit, über einen Dateinamen auf seine geöffneten Dateien zuzugreifen: Das Öffnen entspricht dem Aufrufen . Diese Namen sind nützlich, wenn ein Programm einen Dateinamen benötigt, Sie jedoch eine bereits geöffnete Datei (z. B. eine Pipe oder einen Socket) übergeben möchten. Beispielsweise verwenden die Shells, die die Prozessersetzung implementieren , diese, sofern verfügbar (mithilfe einer temporären Named Pipe, wenn diese nicht verfügbar ist)./dev/fd/NUM
dup(NUM)
/dev/fd
Wo /dev/fd
vorhanden, gibt es auch normalerweise (immer?) Synonyme (manchmal symbolische Links, manchmal harte Links, manchmal magische Dateien mit entsprechenden Eigenschaften) /dev/stdin
= /dev/fd/0
, /dev/stdout
= /dev/fd/1
, /dev/stderr
= /dev/fd/2
.
- Unter Linux gibt
/dev/fd
es einen symbolischen Link zu /proc/self/fd
.
- Unter den meisten Unices ( IRIX , OpenBSD , NetBSD , SCO, Solaris ,…) sind die Einträge in
/dev/fd
Zeichengeräte. In der Regel wird angezeigt, ob der Dateideskriptor geöffnet ist oder nicht, und Einträge für Dateideskriptoren über einer bestimmten Anzahl sind möglicherweise nicht verfügbar.
- Unter FreeBSD und OSX stellt das Dateisystem fdescfs ein dynamisches
/dev/fd
Verzeichnis zur Verfügung, das den offenen Deskriptoren des aufrufenden Prozesses folgt. Eine statische /dev/fd
ist vorhanden /dev/fd
ist nicht montiert.
- Wird unter OSF / 1 (Tru64)
/dev/fd
über fdfs bereitgestellt .
- Unter
/dev/fd
AIX oder HP-UX gibt es keine .
pfiles
zeigt der Befehl den Dateideskriptorpfad an. Diese Informationen werden aus dem/proc/<pid>/path
Verzeichnis abgerufen, das Sie möglicherweise auch erwähnen. Siehe docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.htmlDie Art
/proc
und Weise der Implementierung und die darin enthaltenen Funktionen sind in keiner Weise standardisiert, siehe hier . Laut Wikipedia läuft FreeBSD aus/proc
, siehe hier für Details .Ab
/dev
,/dev/fd/
ist es nicht Teil von POSIX oder der Single User Specification (SUSv3) , während System V und BSD unterstützen.Nachtrag:
Linux:
/dev/fd/*
sind symlinks zu/proc/self/fd
.FreeBSD:
/dev/fd/*
wird über fdescfs bereitgestellt.NetBSD: wie FreeBSD.
OpenBSD: wie FreeBSD.
Solaris: hat
/dev/fd/*
.IRIX: hat
/dev/fd/*
.Tru64 Unix:
/dev/fd/*
Laut nixdoc.net ist die Original- Tru64-Dokumentation bei HP unergründlich (Junge, was für ein Durcheinander! Du findest nichts!).AIX: Keine Angabe aus öffentlich zugänglichen Unterlagen.
HP-UX: wie AIX.
quelle
/dev/fd/1
auf einer BSD eine, die auf meine aktuelle verlinkt1>
? Eine Sache, die ich normalerweise unter Linux mache, istecho 'command' | . /dev/fd/0
- ist es wahrscheinlich, dass so etwas auf der ganzen Linie funktioniert, denken Sie?