Wie kann ich Dateinamen mit dem Befehl linux drucken, wenn der Dateideskriptor einer von einem Prozess geöffneten Datei bekannt ist?

3216
techfun

Ich kenne den Dateideskriptor einer Datei, die von einem Prozess geöffnet wurde, aber ich kenne die Prozess-ID nicht. Wie kann ich Dateinamen von der Linux-Eingabeaufforderung aus drucken, wenn ich den Dateideskriptor einer von einem Prozess geöffneten Datei kenne?

4
@tohuwawohu Es ist die Liste der Dateien, die Prozess-IDs verwenden. In diesem Fall habe ich nicht nur die Prozess-ID, sondern den Dateibeschreiber techfun vor 10 Jahren 0
Ah, ok, Entschuldigung, habe diesen Punkt nicht verstanden. Sie haben also recht, es ist kein Dup. tohuwawohu vor 10 Jahren 0

2 Antworten auf die Frage

3
grawity

Wenn Sie die Prozess-ID nicht kennen, müssen Sie alle Prozesse überprüfen, für die die gleiche fd # geöffnet ist, da Dateideskriptoren nicht global eindeutig sind. Je kleiner die fd #, desto mehr Prozesse werden geöffnet (z. B. auf meinem System, selbst wenn die fd # etwa 30 ist, muss ich immer noch zwischen 15 Prozessen raten. Wenn ich nach fd # um 10 suchte, dann hätte die Liste ~ 170 Prozesse).

Das proc-Dateisystem zeigt die Dateibeschreibungen als symbolische Links unter an ./proc/<pid>/fd

# ls -l / proc / 1 / fd lrwx ------ 1 Wurzel Wurzel 64 12. Februar 22:10 / proc / 1 / fd / 0 -> / dev / null lrwx ------ 1 wurzel wurzel 64 Feb 12 22:10 / proc / 1 / fd / 1 -> / dev / null lrwx ------ 1 root root 64 12. Februar 22:10 / proc / 1 / fd / 2 -> / dev / null l-wx ------ 1 wurzel wurzel 64 Feb 12 22:10 / proc / 1 / fd / 3 -> / dev / kmsg lrwx ------ 1 wurzel wurzel 64 Feb 12 22:10 / proc / 1 / fd / 4 -> anon_inode: [eventpoll] lrwx ------ 1 wurzel wurzel 64 Feb 12 22:10 / proc / 1 / fd / 5 -> anon_inode: [signalfd] lr-x ------ 1 wurzel wurzel 64 Feb 12 22:10 / proc / 1 / fd / 6 -> / sys / fs / cgroup / systemd / ...usw... 

Um beispielsweise in allen Prozessen nach fd # 5 zu suchen:

# ls -l / proc / * / fd / 5 lrwx ------ 1 wurzel wurzel 64 Feb 12 22:10 / proc / 1 / fd / 5 -> anon_inode: [signalfd] lrwx ------ 1 wurzel wurzel 64 Feb 12 22:15 / proc / 129 / fd / 5 -> socket: [6980] lrwx ------ 1 wurzel wurzel 64 Feb 12 22:15 / proc / 168 / fd / 5 -> socket: [7847] lrwx ------ 1 wurzel wurzel 64 Feb 12 22:15 / proc / 341 / fd / 5 -> anon_inode: [eventfd] lr-x ------ 1 wurzel wurzel 64 Feb 12 22:15 / proc / 342 / fd / 5 -> anon_inode: inotify ...usw... 

Die genaue Schnittstelle zum Auflösen von Symlink-Zielen lautet readlink():

# readlink / proc / 427529 / fd / 7 /home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp 
Sehr gute antwort! Jetzt verstehe ich auch, was los ist :-) tohuwawohu vor 10 Jahren 0
1
tohuwawohu

Aus der lsof-Manpage :

Um den Prozess zu finden, der / u / abe / foo geöffnet hat, verwenden Sie:

lsof /u/abe/foo

Siehe auch dieses Tutorial auflsof Am diesen Hinweisen auflsof

Danke für die Antwort. Aber eigentlich. Ich weiß in diesem Fall nicht "/ u / able / foo file". Es ist nur ein Dateideskriptor verfügbar techfun vor 10 Jahren 0
Könnten Sie bitte ein Beispiel geben? tohuwawohu vor 10 Jahren 0
Ich kenne Dateideskriptor (Ganzzahl) von einem zufälligen Prozess, der auf dem Server gestartet wird. Es bleibt nach dem Prozessaufruf geöffnet. Ich muss den Dateipfad kennen. techfun vor 10 Jahren 0
Entschuldigung, ich bin völlig verwirrt. In dieser Antwort (http://superuser.com/a/716010/84724) erfahren Sie, wie Sie alle Dateinamen einschließlich des Pfads erhalten, wenn Sie den Vorgang kennen. Entweder Sie kennen die zu überprüfende Datei, dann gilt meine Antwort, oder Sie kennen den Vorgang, dann gilt die verknüpfte Antwort. Ich kann einfach nicht sehen, was fehlt :-( tohuwawohu vor 10 Jahren 1
Ich denke, es gibt einige 'lsof'-Beschwörungen, die eine bestimmte fd # für alle Prozesse auflisten würden, aber ich habe keine Ahnung, wie es aussieht. grawity vor 10 Jahren 0