Mam proces (dbus-daemon), który ma wiele otwartych połączeń przez gniazda UNIX. Jednym z tych połączeń jest fd # 36:
=$ ps uw -p 23284
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
depesz 23284 0.0 0.0 24680 1772 ? Ss 15:25 0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
=$ ls -l /proc/23284/fd/36
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]
=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
unix 3 [ ] STREAM CONNECTED 1013410 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
=$ netstat -nxp | grep dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1013953 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1013825 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1013726 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1013471 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1013410 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1012325 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1012302 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1012289 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1012151 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011957 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011937 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011900 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011775 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011771 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011769 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011766 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011663 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011635 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011627 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011540 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011480 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011349 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011312 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011284 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011250 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011231 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011155 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011061 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011049 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011035 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1011013 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1010961 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
unix 3 [ ] STREAM CONNECTED 1010945 23284/dbus-daemon @/tmp/dbus-3XDU4PYEzD
Na podstawie połączeń numerycznych zakładam, że dbus-daemon to tak naprawdę serwer. Co jest OK Ale jak mogę znaleźć, który proces jest z nim połączony - używając połączenia, które jest 36 uchwytem pliku w programie uruchamiającym dbus? Próbowałem lsof, a nawet greps na / proc / net / unix, ale nie mogę znaleźć sposobu na znalezienie procesu klienta.
Odpowiedzi:
Całkiem niedawno natknąłem się na podobny problem. Byłem zszokowany, gdy dowiedziałem się, że istnieją przypadki, w których może to nie być możliwe. Odkopałem komentarz twórcy lsof (Vic Abell), w którym wskazał, że zależy to w dużej mierze od implementacji gniazd unixowych. Czasami dostępne są informacje o „punkcie końcowym” dla gniazda, a czasem nie. Niestety, jak podkreśla, w Linuksie jest to niemożliwe.
Jeśli spojrzysz na / proc / net / unix, zobaczysz na własne oczy, że (przynajmniej w moim systemie) ma absolutną rację. Nadal jestem w szoku, ponieważ uważam, że taka funkcja jest niezbędna podczas śledzenia problemów z serwerem.
źródło
/proc/net/unix
PODDA Ci plik docelowy losowego odniesienia do gniazda domeny, z którego wykopałeś/proc/.../fd/
.Ta odpowiedź dotyczy tylko systemu Linux. Na podstawie odpowiedzi z Unix & Linux Stack Exchange udało mi się zidentyfikować drugi koniec gniazda domeny unix za pomocą wbudowanych struktur danych, do których można uzyskać dostęp za pomocą
gdb
i/proc/kcore
. Musisz włączyć opcjeCONFIG_DEBUG_INFO
iCONFIG_PROC_KCORE
jądra.Możesz użyć,
lsof
aby uzyskać adres jądra gniazda, który przyjmuje postać wskaźnika, np0xffff8803e256d9c0
. Liczba ta jest w rzeczywistości adresem odpowiedniej struktury lub typu pamięci w jądrzestruct unix_sock
. Ta struktura ma pole o nazwie,peer
które wskazuje na drugi koniec gniazda. Więc poleceniawypisze adres drugiego końca połączenia. Możesz grepować wynik
lsof -U
dla tego numeru, aby zidentyfikować numer procesu i deskryptora pliku tego drugiego końca.Niektóre dystrybucje wydają się zapewniać symbole debugowania jądra jako osobny pakiet, który zająłby miejsce
vmlinux
pliku w powyższym poleceniu.źródło
peer
elementu wunix_sock
strukturze. W moim systemie x86_64 to przesunięcie wynosi 656 bajtów, więc mógłbym uzyskać ten drugi koniec za pomocąp ((void**)0xffff8803e256d9c0)[0x52]
. Oczywiście nadal potrzebujeszCONFIG_PROC_KCORE
.Właściwie
ss
odiproute2
(zamiennik netstat, ifconfig itp.) Może pokazać te informacje.Oto przykład pokazujący gniazdo domeny unix ssh-agent, z którym
ssh
połączony jest proces:źródło
Gniazdom uniksowym zwykle przypisuje się numery parami i zwykle następują one po sobie. Więc dla ciebie para prawdopodobnie wynosiłaby 1013410 +/- 1. Zobacz, który z nich istnieje i zgadnij, kto jest winowajcą.
źródło
Napisałem narzędzie, które wykorzystuje metodę gdb MvG, aby niezawodnie uzyskać informacje o gniazdach, symbole debugowania jądra nie są potrzebne.
Aby połączyć proces z danym gniazdem, przekaż mu numer i-węzła:
Aby dowiedzieć się o wszystkich procesach jednocześnie
netstat_unix
, dodaje kolumnę do danych wyjściowych netstat:Spróbuj,
netstat_unix --dump
jeśli potrzebujesz wyników, które można łatwo przeanalizować.Szczegółowe informacje można znaleźć na stronie https://github.com/lemonsqueeze/unix_sockets_peers .
Dla informacji, włamanie i-węzła + 1 / -1 nie jest niezawodne. Działa przez większość czasu, ale zawiedzie lub (gorzej) zwróci niewłaściwe gniazdo, jeśli nie będziesz miał szczęścia.
źródło
Edytuj swój system.conf
W tym pliku możesz dodać więcej rzeczy do celów debugowania.
Lokalizacja pliku:
/etc/dbus-1/system.conf
Źródło: http://old.nabble.com/dbus-send-error-td29893862.html
Kilka innych przydatnych rzeczy dotyczących gniazd unixowych
Najprostszym sposobem, aby dowiedzieć się, co dzieje się w autobusie, jest uruchomienie
dbus-monitor
programu, który jest dostarczany z pakietem D-BusMożesz także spróbować użyć
dbus-cleanup-sockets
do czyszczenia resztek gniazd.Poniższe polecenie pokaże, który proces jest podłączony ile razy do gniazd dbus na podstawie
netstat
danych wyjściowych:(testowany na Ubuntu)
Hardcorowy sposób: to polecenie ręcznie znajdzie procesy z / proc i pokaże, które używają najwięcej połączeń (wszystkie typy gniazd):
Przykładowe dane wyjściowe:
(liczba, PID, a następny wiersz zawiera szczegółowe informacje na temat procesu)
(testowany na Ubuntu)
Baw się dobrze.
Zobacz także powiązane artykuły w celach informacyjnych:
źródło