Eu tenho um processo (dbus-daemon) que possui muitas conexões abertas nos soquetes UNIX. Uma dessas conexões é 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
Com base em conexões numéricas, presumo que o dbus-daemon seja realmente servidor. O que é bom. Mas como posso encontrar qual processo está conectado a ele - usando a conexão que é a 36ª manipulação de arquivos no dbus-launcher? Tentei lsof e até mesmo greps em / proc / net / unix, mas não consigo descobrir uma maneira de encontrar o processo do cliente.
Respostas:
Recentemente, me deparei com um problema semelhante. Fiquei chocado ao descobrir que há casos em que isso pode não ser possível. Eu descobri um comentário do criador de lsof (Vic Abell), onde ele apontou que isso depende muito da implementação do soquete unix. Às vezes, as informações "endpoint" para soquete estão disponíveis e outras não. Infelizmente, é impossível no Linux, como ele aponta.
Se você olhar para / proc / net / unix, poderá ver por si mesmo que (pelo menos no meu sistema) ele está absolutamente certo. Ainda estou chocado, porque acho esse recurso essencial ao rastrear problemas no servidor.
fonte
/proc/net/unix
o arquivo de destino de uma referência de soquete de domínio aleatório foi extraído/proc/.../fd/
.Esta resposta é apenas para Linux. Com base em uma resposta do Unix e Linux Stack Exchange, identifiquei com êxito a outra extremidade de um soquete de domínio unix usando estruturas de dados no kernel, acessadas usando
gdb
e/proc/kcore
. Você precisa habilitar as opçõesCONFIG_DEBUG_INFO
e doCONFIG_PROC_KCORE
kernel.Você pode usar
lsof
para obter o endereço do kernel do soquete, que assume a forma de um ponteiro, por exemplo0xffff8803e256d9c0
. Esse número é realmente o endereço da estrutura ou tipo de memória relevante no kernelstruct unix_sock
. Essa estrutura tem um campo chamadopeer
que aponta na outra extremidade do soquete. Então os comandosimprimirá o endereço da outra extremidade da conexão. Você pode receber a saída
lsof -U
desse número para identificar o número do processo e do descritor de arquivo dessa outra extremidade.Algumas distribuições parecem fornecer símbolos de depuração do kernel como um pacote separado, que substituirá o
vmlinux
arquivo no comando acima.fonte
peer
membro naunix_sock
estrutura. No meu sistema x86_64, esse deslocamento é de 656 bytes, para que eu pudesse obter essa outra extremidade usandop ((void**)0xffff8803e256d9c0)[0x52]
. Você ainda precisaCONFIG_PROC_KCORE
, obviamente.Na verdade,
ss
deiproute2
(substituição de netstat, ifconfig, etc.) pode mostrar essas informações.Aqui está um exemplo mostrando um soquete de domínio ssh-agent unix ao qual um
ssh
processo se conectou:fonte
Soquetes Unix geralmente recebem números em pares e geralmente são consecutivos. Portanto, o par para você provavelmente seria 1013410 +/- 1. Veja qual desses dois existe e adivinhe o culpado.
fonte
Eu escrevi uma ferramenta que usa o método gdb do MvG para obter informações confiáveis de pares de soquetes, não são necessários símbolos de depuração do kernel.
Para conectar o processo a um determinado soquete, passe o número do inode:
Para descobrir todos os processos de uma só vez
netstat_unix
, ele adiciona uma coluna à saída do netstat:Tente
netstat_unix --dump
se você precisar de uma saída fácil de analisar.Consulte https://github.com/lemonsqueeze/unix_sockets_peers para obter detalhes.
Para informações, o inode + 1 / -1 hack não é confiável. Funciona na maioria das vezes, mas falha ou (pior) retorna o soquete errado se você não tiver sorte.
fonte
Edite seu system.conf
Nesse arquivo, você pode adicionar mais itens para fins de depuração.
Localização de arquivo:
/etc/dbus-1/system.conf
Fonte: http://old.nabble.com/dbus-send-error-td29893862.html
Algumas outras coisas úteis sobre soquetes unix
A maneira mais simples de descobrir o que está acontecendo no barramento é executar o
dbus-monitor
programa, que vem com o pacote D-BusAlém disso, você pode tentar usar
dbus-cleanup-sockets
para limpar os soquetes restantes.O comando a seguir mostrará qual processo está conectado quantas vezes aos soquetes do dbus com base na
netstat
saída:(testado no Ubuntu)
Maneira hardcore: Este comando encontrará manualmente os processos de / proc e mostrará quais estão usando mais conexões (todos os tipos de soquetes):
Exemplo de saída:
(contagem, PID e a próxima linha contém detalhes sobre o processo)
(testado no Ubuntu)
Diverta-se.
Consulte também artigos relacionados para a referência:
fonte