Lesen Sie "/ proc", um festzustellen, ob ein Prozess einen Port geöffnet hat

12

Ich muss wissen, ob ein Prozess mit einer bestimmten PID einen Port ohne Verwendung externer Befehle geöffnet hat. Ich muss dann das /procDateisystem verwenden. Ich kann die /proc/$PID/net/tcpDatei zum Beispiel lesen und Informationen über die vom Prozess geöffneten TCP-Ports erhalten. Bei einem Multithread-Prozess /proc/$PID/task/$TIDenthält das Verzeichnis jedoch auch eine net/tcpDatei. Meine Frage ist :

Muss ich alle Thread- net/tcpDateien durchgehen , oder wird der von Threads geöffnete Port in die Prozessdatei geschrieben net/tcp?

Rmonjo
quelle

Antworten:

22

Ich kann zum Beispiel die Datei / proc / $ PID / net / tcp lesen und Informationen über die vom Prozess geöffneten TCP-Ports erhalten.

Diese Datei ist keine Liste der vom Prozess geöffneten TCP-Ports . Es ist eine Liste aller offenen TCP-Ports im aktuellen Netzwerk-Namespace. Bei Prozessen, die im selben Netzwerk-Namespace ausgeführt werden, ist dies identisch mit dem Inhalt von /proc/net/tcp.

Um von Ihrem Prozess geöffnete Ports zu finden, müssen Sie eine Liste der Socket-Deskriptoren abrufen /proc/<pid>/fdund diese Deskriptoren dann dem inodeFeld von zuordnen /proc/net/tcp.

Larsks
quelle
Vielen Dank für Ihre Antwort. Und wenn der Prozess Multithreading ist, muss ich das gesamte fdVerzeichnis jedes Threads durchgehen ? Oder /proc/pid/fd"erbt" das /proc/pid/task/tid/fdVerzeichnis die Verzeichnisse?
Rmonjo
Ich bin mir nicht sicher, aber das scheint einfach zu testen zu sein.
Larsks
7
@rmonjo Threads können keine Dateien öffnen, nur Prozesse. Das fdVerzeichnis eines Threads wiederholt nur das fdVerzeichnis des Prozesses.
Gilles 'SO - hör auf böse zu sein'