C'è un modo per intercettare la comunicazione tra processi in Unix / Linux?


15

Per intercettare / analizzare il traffico di rete, abbiamo un'utilità chiamata Wireshark .

Abbiamo un'utilità simile per intercettare tutte le comunicazioni tra processi tra due processi in Unix / Linux?

Ho creato alcuni processi in memoria e ho bisogno di delineare il modo in cui comunicano tra loro.


1
Quali meccanismi IPC stai usando per la comunicazione?
axel_c,

@axel_c: la fonte del processo non è con me, ma penso di aver letto "Memoria condivisa" da qualche parte nella documentazione.
Lazer,

Risposte:


19

Questo dipende molto dal meccanismo di comunicazione.

  • All'estremità più trasparente dello spettro, i processi possono comunicare tramite prese Internet (es. IP ). Quindi WireShark o TCPDump possono mostrare tutto il traffico puntandolo all'interfaccia di loopback.

  • A livello intermedio, è possibile osservare il traffico su tubi e prese unix con truss/ strace/ trace/ ..., la motosega dell'esercito svizzero di tracciabilità del sistema. Questo può rallentare significativamente i processi, tuttavia, quindi potrebbe non essere adatto per la profilazione.

  • All'estremità più opaca dello spettro, c'è la memoria condivisa. Il principio operativo di base della memoria condivisa è che gli accessi sono completamente trasparenti in ogni processo coinvolto, sono necessarie solo chiamate di sistema per impostare le aree di memoria condivise. Tracciare questi accessi alla memoria dall'esterno sarebbe difficile, specialmente se hai bisogno dell'osservazione per non disturbare il timing. Puoi provare strumenti come il Linux Trace Toolkit (richiede una patch del kernel) e vedere se riesci a estrarre informazioni utili; è il tipo di area in cui mi aspetto che Solaris abbia uno strumento migliore (ma non ne ho conoscenza).

    Se si dispone della fonte, l'opzione migliore potrebbe essere quella di aggiungere istruzioni di tracciamento alle funzioni della libreria chiave. Ciò può essere ottenuto con i LD_PRELOADtrucchi anche se non si dispone della (intera) fonte, purché si abbia una comprensione sufficiente del flusso di controllo della parte del programma che accede alla memoria condivisa.


6

Questo mostrerà ciò che un processo legge e scrive:

strace -ewrite -p $PID

Non è un output pulito (mostra righe come: write (#,)), ma funziona! (ed è a riga singola: D) Potrebbe anche non piacere il fatto che gli argomenti siano abbreviati. Per controllare quel parametro -s che imposta la massima lunghezza delle stringhe visualizzate.

Cattura tutti i flussi, quindi potresti voler filtrare in qualche modo.

Puoi filtrarlo:

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

mostra solo le chiamate al descrittore 1. 2> & 1 è il reindirizzamento di stderr su stdout, come impostazione predefinita strace scrive su stderr.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.