monitorare il traffico di condotte tra processi


13

Ho due processi Linux che comunicano tramite una pipe senza nome. Come può monitorare il traffico nel tubo? Come posso inserire dati nella pipe? Ho accesso root e conosco l'inode della pipe.

Risposte:


7

Una pipe senza nome è per sua natura privata delle applicazioni che hanno il descrittore di file. Non esiste un modo di principio per osservare o modificare il traffico sulla pipa. Non penso che ci sia un modo per guardare la pipe direttamente su Linux.

C'è un modo senza principi di fare più o meno quello che stai cercando, però: attraverso la chiamata di sistema ptrace . Non ti attaccheresti sul tubo di per sé, ma su uno dei processi. Per l'osservazione, utilizzare strace , ad es

strace -p1234 -s99999 -e write

dove si 1234trova l'ID del processo di un processo che scrive sulla pipe. La modifica dei dati è più difficile, ma può essere eseguita. Penso che il modo più semplice sarebbe innanzitutto impostare un processo intermedio che copi il suo input standard sul suo output standard, più i dati che vuoi iniettare (e meno tutti i dati che vuoi sopprimere). Crea due pipe nominate e avvia quel processo intermedio con stdin su una pipe e stdout sull'altra. Quindi utilizzare un debugger (ad esempio GDB ) per eseguire entrambi i processi di destinazione opensulla pipe denominata appropriata, quindi dupposizionare la pipe sul descrittore di file appropriato. Si noti che esiste la possibilità che si arresti in modo anomalo uno dei processi nel processo.

(Se non capisci l'ultimo paragrafo, mi dispiace, ma richiede un certo livello di tecnicità. Non credo che ci sia un modo più semplice.)


Grazie, ho capito. Quello che ho effettivamente provato è andare a / proc / $ PID / fd, dove ho trovato le voci del file per le pipe senza nome di uno dei processi e sono riuscito a leggere e dati usando semplicemente cat ed echo nella shell, ma il comportamento in qualche modo incoerente. Devo indagare ulteriormente.
jackhab,

1
@jackhab: Oh, pensavo non funzionasse per le pipe. Ma come hai scoperto, non ti sarà di grande aiuto per monitorare il traffico, perché ogni byte dal produttore andrà esattamente a un consumatore e non puoi controllare se il tuo monitor o il consumatore reale lo riceveranno. Quindi dovresti essere in grado di iniettare i dati in quel modo.
Gilles 'SO- smetti di essere malvagio' il

2

Alcuni strumenti utili per il monitoraggio di una pipe:

Tee Pipe Viewer

Per un programma già in esecuzione in cui non si controlla il piping, consultare il metodo gdb:
reindirizzamento dell'output da un processo in esecuzione .

Oppure si può usare strace :

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.


1
Quello che intendevo è intercettare la pipa del processo già in esecuzione. Il processo A avvia il processo B e parla con esso tramite una pipe, quindi non ho modo di utilizzare le utility proxy come tee o pv.
jackhab,

Aggiunti altri metodi.
harrymc,

Invece di usare grep, puoi specificare "-e write = 1" per limitare l'output ai dati scritti in fd 1.
William Pursell,
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.