Existe uma maneira de interceptar a comunicação entre processos no Unix / Linux?

15

Para interceptar / analisar o tráfego de rede, temos um utilitário chamado Wireshark .

Temos um utilitário semelhante para interceptar toda a comunicação entre processos entre dois processos no Unix / Linux?

Criei alguns processos na memória e preciso criar um perfil de como eles se comunicam.

lazer
fonte
1
Que mecanismo (s) IPC você está usando para a comunicação?
axel_c
@axel_c: A fonte do processo não está comigo, mas acho que li "Memória compartilhada" em algum lugar da documentação.
Lazer

Respostas:

19

Isso depende muito do mecanismo de comunicação.

  • No extremo mais transparente do espectro, os processos podem se comunicar usando soquetes da Internet (ou seja, IP ). Então o wireshark ou o tcpdump pode mostrar todo o tráfego apontando-o na interface de loopback.

  • Em um nível intermediário, o tráfego em tubos e soquetes unix pode ser observado com truss/ strace/ trace/ ..., a serra elétrica do exército suíço para rastreamento de sistemas. No entanto, isso pode atrasar significativamente os processos, portanto, pode não ser adequado para criação de perfil.

  • No extremo mais opaco do espectro, há memória compartilhada. O princípio operacional básico da memória compartilhada é que os acessos são completamente transparentes em cada processo envolvido; você só precisa de chamadas do sistema para configurar regiões de memória compartilhada. Rastrear esses acessos à memória a partir do exterior seria difícil, especialmente se você precisar que a observação não perturbe o tempo. Você pode experimentar ferramentas como o kit de ferramentas de rastreamento do Linux (requer um patch do kernel) e verificar se é possível extrair informações úteis; é o tipo de área em que eu esperaria que o Solaris tivesse uma ferramenta melhor (mas não tenho conhecimento dela).

    Se você possui a fonte, sua melhor opção pode ser adicionar instruções de rastreamento às funções da biblioteca de chaves. Isso pode ser possível com LD_PRELOADtruques, mesmo se você não tiver a fonte (inteira), desde que tenha entendimento suficiente do fluxo de controle da parte do programa que acessa a memória compartilhada.

Gilles 'SO- parar de ser mau'
fonte
6

Isso mostrará o que um processo lê e grava:

strace -ewrite -p $PID

Não é uma saída limpa (mostra linhas como: write (#,)), mas funciona! (e é uma linha: D) Você também pode não gostar do fato de que os argumentos são abreviados. Para controlar esse parâmetro, use -s que define o comprimento máximo das strings exibidas.

Ele captura todos os fluxos, então você pode filtrar isso de alguma forma.

Você pode filtrar:

strace -ewrite -p $PID 2>&1 | grep "write(1"

mostra apenas as chamadas do descritor 1. 2> & 1 é redirecionar stderr para stdout, como strace grava no stderr por padrão.

naugtur
fonte