Para interceptar / analizar el tráfico de red, tenemos una utilidad llamada Wireshark .
¿Tenemos una utilidad similar para interceptar toda la comunicación entre procesos entre dos procesos en Unix / Linux?
He creado algunos procesos en la memoria y necesito perfilar cómo se comunican entre sí.
command-line
shell
process
ipc
Lazer
fuente
fuente
Respuestas:
Esto depende mucho del mecanismo de comunicación.
En el extremo más transparente del espectro, los procesos pueden comunicarse mediante tomas de Internet (es decir, IP ). Entonces wireshark o tcpdump pueden mostrar todo el tráfico apuntándolo a la interfaz de bucle invertido.
En un nivel intermedio, se puede observar el tráfico en tuberías y tomas de corriente unix con
truss
/strace
/trace
/ ..., la motosierra del ejército suizo de rastreo del sistema. Sin embargo, esto puede ralentizar significativamente los procesos, por lo que puede no ser adecuado para la creación de perfiles.En el extremo más opaco del espectro, hay memoria compartida. El principio operativo básico de la memoria compartida es que los accesos son completamente transparentes en cada proceso involucrado, solo necesita llamadas al sistema para configurar regiones de memoria compartida. Rastrear estos accesos a la memoria desde el exterior sería difícil, especialmente si necesita la observación para no perturbar el tiempo. Puede probar herramientas como el kit de herramientas de rastreo de Linux (requiere un parche de kernel) y ver si puede extraer información útil; Es el tipo de área donde esperaría que Solaris tuviera una herramienta mejor (pero no tengo conocimiento de ello).
Si tiene la fuente, su mejor opción puede ser agregar declaraciones de rastreo a las funciones clave de la biblioteca. Esto puede lograrse con
LD_PRELOAD
trucos incluso si no tiene la fuente (completa), siempre y cuando tenga suficiente comprensión del flujo de control de la parte del programa que accede a la memoria compartida.fuente
Esto mostrará lo que un proceso lee y escribe:
No es una salida limpia (muestra líneas como: write (#,)), ¡pero funciona! (y es de una sola línea: D) También es posible que no le guste el hecho de que los argumentos se abrevian. Para controlar ese parámetro -s que establece la longitud máxima de las cadenas que se muestran.
Captura todas las transmisiones, por lo que es posible que desee filtrar eso de alguna manera.
Puedes filtrarlo:
muestra solo descriptor 1 llamadas. 2> & 1 es redirigir stderr a stdout, ya que strace escribe en stderr por defecto.
fuente