supervisar el tráfico de tuberías entre procesos


13

Tengo dos procesos de Linux que se comunican a través de una tubería sin nombre. ¿Cómo puede monitorear el tráfico en la tubería? ¿Cómo puedo inyectar datos en la tubería? Tengo acceso root y conozco el inodo de la tubería.

Respuestas:


7

Una canalización sin nombre es privada por naturaleza para las aplicaciones que tienen el descriptor de archivo. No hay una forma de principios para observar o modificar el tráfico en la tubería. Tampoco creo que haya una manera de mirar la tubería directamente en Linux.

Sin embargo, hay una forma sin principios de hacer más o menos lo que buscas: a través de la llamada al sistema ptrace . No estarías clavando en la tubería per se, sino en uno de los procesos. Para la observación, use strace , p. Ej.

strace -p1234 -s99999 -e write

donde 1234está el ID de proceso de un proceso que escribe en la tubería. Modificar los datos es más difícil, pero se puede hacer. Creo que la forma más fácil sería configurar primero un proceso intermedio que copie su entrada estándar a su salida estándar, más los datos que desea inyectar (y menos cualquier información que desee suprimir). Cree dos tuberías con nombre y comience ese proceso intermedio con stdin en una tubería y stdout en la otra. Luego, use un depurador (por ejemplo, GDB ) para hacer que ambos procesos de destino se ejecuten openen la tubería con el nombre apropiado, luego dupcoloque la tubería en el descriptor de archivo apropiado. Tenga en cuenta que existe la posibilidad de que bloquee uno de los procesos en el proceso.

(Si no comprende el último párrafo, lo siento, pero requiere un cierto nivel de tecnicidad. No creo que haya una manera más fácil).


Gracias, entiendo. Lo que realmente intenté fue ir a / proc / $ PID / fd, donde encontré las entradas de archivo para las canalizaciones sin nombre de uno de los procesos y logré leer y datos usando cat y echo simples en el shell, pero el comportamiento de alguna manera inconsistente. Necesito investigar más a fondo.
jackhab

1
@jackhab: Oh, pensé que no funcionaba para las tuberías. Pero como descubrió, no le ayudará tanto para monitorear el tráfico, porque cada byte del productor irá exactamente a un consumidor y usted no puede controlar si su monitor o el consumidor real lo obtendrán. Entonces deberías poder inyectar datos de esa manera.
Gilles 'SO- deja de ser malvado'

2

Algunas herramientas útiles para monitorear una tubería:

Visor de tubería
camiseta

Para un programa que ya se está ejecutando y no se controlan las tuberías, consulte el método gdb:
Redirigir la salida de un proceso en ejecución .

O uno puede usar strace :

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

muestra solo descriptor 1 llamadas. "2> & 1" es redirigir stderr a stdout, ya que strace escribe en stderr por defecto.


1
Lo que quise decir es escuchas telefónicas a la tubería del proceso que ya se está ejecutando. El proceso A inicia el proceso B y habla con él a través de una tubería, por lo que no tengo forma de utilizar utilidades proxy como tee o pv.
jackhab

Se agregaron algunos métodos más.
harrymc

En lugar de usar grep, puede especificar "-e write = 1" para limitar la salida a los datos escritos en fd 1.
William Pursell
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.