Jak dowiedzieć się więcej o plikach gniazd w / proc / fd?


33

Przeglądając / proc / $ mypid / fd /, widzę te pliki

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]

Ponieważ mam dostęp do kodu, wiem, że te gniazda są powiązane z połączeniami TCP (jedno to połączenie z portem 5672 na innym komputerze, drugie to połączenie z portem 3306 na innym komputerze), ale chcę wiedzieć, które gniazdo jest związany z jakim połączeniem. Jak mogę to zrobić?

Mówiąc bardziej ogólnie, jak mogę zapytać system operacyjny, co znajduje się na drugim końcu gniazda?


1
Użyj socat....
heemayl

Odpowiedzi:


40

Polecenie lsof

Dobrym rozwiązaniem może być lsof. Jak man lsofstwierdza, jest to przydatne do uzyskiwania informacji o open files such as Internet sockets or Unix Domain sockets.


Użyj tego

Najpierw uzyskaj przegląd /proc/$PID/fd/i wymienione numery gniazd.
Na przykład socket:[14240]może Cię zainteresować.

Następnie użyj, lsof -i -a -p $PIDaby wydrukować listę wszystkich $PIDzastosowań plików sieciowych .

  • -i tworzy listę plików sieciowych należących do użytkownika lub procesu

  • -a logicznie łączy lub podane parametry AND

  • -p $PID wybiera informacje tylko o twoim procesie

Typowe wyjście dla mojej przeglądarki działającej z PID o wartości 2543może być:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)

i więcej podobnych linii.

Świetny! Teraz przyjrzyj się bliżej DEVICEkolumnie. Pasuje do naszego wcześniej wymienionego gniazda od /proc/$PID/fd/!
Dzięki tej NAMEsekcji możemy powiedzieć, jaki jest drugi koniec naszego gniazda.

W prawdziwym świecie możesz uzyskać dobrą wydajność, ale po prostu filtruj lub grepdla swojego zainteresowania.

Jestem prawie pewien, że można połączyć wszystkie polecenia, ale to powinno wystarczyć, aby zacząć.


Dziękuję Ci! Pozytywne i zaakceptowane. Widzę gniazdo pokazujące się w lsof jako „unix 0xffff88002704d380 0t0 1423733559”, jak mogę się dowiedzieć, co to jest 0xffff88002704d380?
benhsu

1
„unix 0xfff ...” wygląda jak adres pamięci jądra struktury unix_sock. Ta struktura zawiera wskaźnik do punktu końcowego gniazda. Spójrz na grep -rni ffff88002704d380 /proc. gdzieś w / proc / może leżeć twoja odpowiedź, catznaleziono plik grep. Ale nie zwalaj mnie na to ... Może tu być strasznie źle.
pidi

lsofczyta inne informacje o gnieździe z /proc/net/tcp, /proc/net/tcp6, /proc/net/udpi tak dalej, w zależności od typu gniazda.
Jesin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.