Ich habe einen Prozess (Dbus-Daemon), der viele offene Verbindungen über UNIX-Sockets hat. Eine dieser Verbindungen ist 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
Aufgrund der Anzahl der Verbindungen gehe ich davon aus, dass dbus-daemon tatsächlich ein Server ist. Welches ist in Ordnung. Aber wie kann ich herausfinden, welcher Prozess damit verbunden ist - über die Verbindung, die im dbus-launcher als 36. Dateizugriffspunkt angegeben ist? Versuchte lsof und greift sogar nach / proc / net / unix, aber ich kann keinen Weg finden, den Client-Prozess zu finden.
Antworten:
Vor kurzem bin ich auf ein ähnliches Problem gestoßen. Ich war schockiert, als ich herausfand, dass es Fälle gibt, in denen dies möglicherweise nicht möglich ist. Ich habe einen Kommentar des Entwicklers von lsof (Vic Abell) ausgegraben, in dem er darauf hinwies, dass dies stark von der Implementierung des Unix-Sockets abhängt. Manchmal sind so genannte "Endpunkt" -Informationen für den Socket verfügbar und manchmal nicht. Leider ist es unter Linux unmöglich, wie er betont.
Wenn Sie sich / proc / net / unix ansehen, können Sie sich selbst davon überzeugen, dass er (zumindest auf meinem System) absolut recht hat. Ich bin immer noch schockiert, weil ich solche Funktionen bei der Verfolgung von Serverproblemen für unerlässlich halte.
quelle
/proc/net/unix
SIE die Zieldatei einer zufälligen Domain-Socket-Referenz erhalten, aus der Sie herausgegraben haben/proc/.../fd/
.Diese Antwort gilt nur für Linux. Basierend auf einer Antwort von Unix & Linux Stack Exchange habe ich erfolgreich das andere Ende eines Unix-Domain-Sockets mithilfe von kerninternen Datenstrukturen identifiziert, auf die mit
gdb
und zugegriffen wurde/proc/kcore
. Sie müssen die KerneloptionenCONFIG_DEBUG_INFO
und aktivierenCONFIG_PROC_KCORE
.Mit können
lsof
Sie die Kernel-Adresse des Sockets ermitteln, die die Form eines Zeigers hat, z0xffff8803e256d9c0
. Diese Nummer ist tatsächlich die Adresse der relevanten kernelinternen Speicherstruktur oder des entsprechenden Kerneltypsstruct unix_sock
. Diese Struktur hat ein Feld,peer
das am anderen Ende der Buchse steht. Also die BefehleGibt die Adresse des anderen Endes der Verbindung aus. Sie können die Ausgabe von
lsof -U
nach dieser Nummer durchsuchen, um die Prozess- und Dateideskriptornummer des anderen Endes zu identifizieren.Einige Distributionen scheinen Kernel-Debugsymbole als separates Paket bereitzustellen, das den Platz der
vmlinux
Datei im obigen Befehl einnehmen würde .quelle
peer
Members in derunix_sock
Struktur. Auf meinem x86_64-System beträgt dieser Versatz 656 Byte, sodass ich das andere Ende mit ermitteln kannp ((void**)0xffff8803e256d9c0)[0x52]
. Das brauchst duCONFIG_PROC_KCORE
natürlich noch.Tatsächlich kann
ss
fromiproute2
(Ersatz für netstat, ifconfig usw.) diese Informationen anzeigen.Das folgende Beispiel zeigt einen ssh-agent-Unix-Domain-Socket, mit dem ein
ssh
Prozess verbunden ist:quelle
Unix-Sockets werden normalerweise paarweise und in der Regel fortlaufend nummeriert. Das Paar für Sie wäre also wahrscheinlich 1013410 +/- 1. Sehen Sie, welcher von beiden existiert, und raten Sie dem Täter.
quelle
Ich habe ein Tool geschrieben, das die gdb-Methode von MvG verwendet, um zuverlässig Socket-Peer-Informationen abzurufen. Kernel-Debugsymbole werden nicht benötigt.
Um den Prozess mit einem bestimmten Socket zu verbinden, übergeben Sie ihm die Inode-Nummer:
Um herauszufinden, ob alle Prozesse gleichzeitig ausgeführt werden
netstat_unix
, wird der Ausgabe von netstat eine Spalte hinzugefügt:Probieren Sie es aus,
netstat_unix --dump
wenn Sie eine Ausgabe benötigen, die einfach zu analysieren ist.Weitere Informationen finden Sie unter https://github.com/lemonsqueeze/unix_sockets_peers .
Zur Information, der Inode + 1 / -1 Hack ist nicht zuverlässig. Es funktioniert die meiste Zeit, wird aber versagen oder (schlimmer) die falsche Steckdose zurückgeben, wenn Sie kein Glück haben.
quelle
Bearbeiten Sie Ihre system.conf
In dieser Datei können Sie weitere Informationen zum Debuggen hinzufügen.
Speicherort:
/etc/dbus-1/system.conf
Quelle: http://old.nabble.com/dbus-send-error-td29893862.html
Einige andere nützliche Dinge in Bezug auf Unix-Sockets
Der einfachste Weg, um herauszufinden, was auf dem Bus passiert, besteht darin, das
dbus-monitor
Programm auszuführen , das mit dem D-Bus-Paket geliefert wirdSie können auch versuchen,
dbus-cleanup-sockets
übrig gebliebene Steckdosen zu bereinigen.Der folgende Befehl zeigt Ihnen, welcher Prozess wie oft an die D-Bus-Buchsen angeschlossen ist, basierend auf der
netstat
Ausgabe:(getestet auf Ubuntu)
Hardcore Weg: Dieser Befehl findet manuell die Prozesse aus / proc und zeigt an, welche die meisten Verbindungen benutzen (alle Arten von Sockets):
Beispielausgabe:
(count, PID und die nächste Zeile enthalten Details zum Prozess)
(getestet auf Ubuntu)
Habe Spaß.
Siehe auch verwandte Artikel für die Referenz:
quelle