Saya memiliki proses (dbus-daemon) yang memiliki banyak koneksi terbuka melalui soket UNIX. Salah satu koneksi ini adalah 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
Berdasarkan koneksi angka, saya berasumsi bahwa dbus-daemon sebenarnya adalah server. Tidak apa-apa. Tapi bagaimana saya bisa menemukan proses mana yang terhubung dengannya - menggunakan koneksi yang menangani file ke-36 di dbus-launcher? Mencoba lsof dan bahkan greps di / proc / net / unix tapi saya tidak tahu cara untuk menemukan proses klien.
Jawaban:
Baru-baru ini saya menemukan masalah yang sama. Saya terkejut mengetahui bahwa ada kasus-kasus di mana hal ini tidak mungkin dilakukan. Saya menggali komentar dari pencipta lsof (Vic Abell) di mana ia menunjukkan bahwa ini sangat tergantung pada implementasi soket unix. Kadang-kadang apa yang disebut "titik akhir" informasi untuk soket tersedia dan kadang tidak. Sayangnya tidak mungkin di Linux seperti yang dia tunjukkan.
Jika Anda melihat / proc / net / unix Anda dapat melihat sendiri, bahwa (setidaknya pada sistem saya) ia benar sekali. Saya masih terkejut, karena saya menemukan fitur seperti itu penting ketika melacak masalah server.
sumber
/proc/net/unix
AKAN memberi tahu Anda file target referensi soket domain acak yang telah Anda gali/proc/.../fd/
.Jawaban ini hanya untuk Linux. Berdasarkan jawaban dari Unix & Linux Stack Exchange, saya berhasil mengidentifikasi ujung lain dari soket domain unix menggunakan struktur data in-kernel, diakses menggunakan
gdb
dan/proc/kcore
. Anda perlu mengaktifkan opsiCONFIG_DEBUG_INFO
danCONFIG_PROC_KCORE
kernel.Anda dapat menggunakan
lsof
untuk mendapatkan alamat kernel dari soket, yang berbentuk pointer, misalnya0xffff8803e256d9c0
. Angka itu sebenarnya alamat dari struktur atau tipe memori dalam-kernel yang relevanstruct unix_sock
. Struktur itu memiliki bidang yang disebutpeer
titik di ujung soket yang lain. Jadi perintahnyaakan mencetak alamat ujung koneksi yang lain. Anda dapat menangkap output
lsof -U
untuk nomor itu untuk mengidentifikasi proses dan mengajukan nomor deskripsi dari ujung yang lain.Beberapa distribusi tampaknya menyediakan simbol debug kernel sebagai paket terpisah, yang akan menggantikan
vmlinux
file dalam perintah di atas.sumber
peer
anggota dalamunix_sock
struktur. Pada sistem x86_64 saya, offset itu adalah 656 byte, jadi saya bisa mendapatkan yang lain menggunakanp ((void**)0xffff8803e256d9c0)[0x52]
. Anda masih membutuhkanCONFIG_PROC_KCORE
, jelas.Sebenarnya,
ss
dariiproute2
(pengganti netstat, ifconfig, dll.) Dapat menampilkan informasi ini.Berikut adalah contoh yang menunjukkan soket domain unix ssh-agent yang
ssh
terhubung dengan proses:sumber
Soket Unix biasanya diberi nomor berpasangan, dan biasanya berturut-turut. Jadi pasangan untuk Anda kemungkinan akan menjadi 1013410 +/- 1. Lihat yang mana dari dua itu yang ada dan tebak pelakunya.
sumber
Saya menulis sebuah alat yang menggunakan metode gvb MvG untuk mendapatkan informasi socket peer dengan andal, simbol debug kernel tidak diperlukan.
Untuk menghubungkan proses ke soket yang diberikan, berikan nomor inode:
Untuk mengetahui semua proses sekaligus digunakan
netstat_unix
, itu menambahkan kolom ke output netstat:Coba
netstat_unix --dump
jika Anda membutuhkan output yang mudah diurai.Lihat https://github.com/lemonsqueeze/unix_sockets_peers untuk detailnya.
Sebagai info, inode + 1 / -1 hack tidak dapat diandalkan. Ini berfungsi sebagian besar waktu tetapi akan gagal atau (lebih buruk) mengembalikan soket yang salah jika Anda kurang beruntung.
sumber
Edit system.conf Anda
Dalam file ini Anda bisa menambahkan lebih banyak barang untuk tujuan debugging.
Lokasi file:
/etc/dbus-1/system.conf
Sumber: http://old.nabble.com/dbus-send-error-td29893862.html
Beberapa hal bermanfaat lainnya tentang soket unix
Cara paling sederhana untuk mengetahui apa yang terjadi di bus adalah dengan menjalankan
dbus-monitor
program, yang datang dengan paket D-BusAnda juga dapat mencoba menggunakan
dbus-cleanup-sockets
untuk membersihkan soket sisa.Perintah berikut akan menunjukkan kepada Anda proses mana yang terhubung berapa kali ke soket dbus berdasarkan
netstat
output:(diuji pada Ubuntu)
Cara hardcore: Perintah ini akan menemukan secara manual proses dari / proc dan menunjukkan yang menggunakan sebagian besar koneksi (semua jenis soket):
Contoh output:
(hitung, PID dan baris berikutnya berisi detail tentang proses)
(diuji pada Ubuntu)
Selamat bersenang-senang.
Lihat juga artikel terkait untuk referensi:
sumber