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?

Eu criei alguns processos na memória e preciso analisar como eles se comunicam entre si.

    
por Lazer 20.08.2010 / 15:17

2 respostas

19

Isso depende muito do mecanismo de comunicação.

  • Na extremidade mais transparente do espectro, os processos podem se comunicar usando sockets de internet (ou seja, IP ). Em seguida, o wireshark ou o tcpdump podem mostrar todo o tráfego, apontando-o na interface de loopback.

  • Em um nível intermediário, o tráfego em pipes e soquetes unix pode ser observado com truss / strace / trace / ... , a motosserra do exército suíço de rastreamento do sistema. Isso pode desacelerar os processos significativamente, no entanto, 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 de memória do lado de fora seria difícil, especialmente se você precisar que a observação não perturbe o tempo. Você pode tentar ferramentas como o Kit de ferramentas de rastreio do Linux (requer um patch de kernel) e ver se é possível extrair informações úteis; é o tipo de área onde eu esperaria que o Solaris tivesse uma ferramenta melhor (mas eu não tenho conhecimento disso).

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

por 20.08.2010 / 16:11
5

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

strace -ewrite -p $PID

Não é uma saída limpa (mostra linhas como: write (#,)), mas funciona! (e é de linha única: 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 tamanho máximo das strings exibidas.

Ele captura todos os streams, então talvez você queira filtrar isso de alguma forma.

Você pode filtrá-lo:

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

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

    
por 12.09.2010 / 10:55