Laz*_*zer 16 command-line shell process ipc
为了拦截/分析网络流量,我们有一个名为Wireshark的实用程序。
我们是否有类似的实用程序来拦截 Unix/Linux 中任意两个进程之间的所有进程间通信?
我在内存中创建了一些进程,我需要分析它们如何相互通信。
Gil*_*il' 20
这在很大程度上取决于通信机制。
在最透明的范围内,进程可以使用互联网套接字(即IP)进行通信。然后wireshark 或tcpdump 可以通过将其指向环回接口来显示所有流量。
在中间级别,可以使用/ / /...,瑞士军用链锯系统跟踪来观察管道和unix 套接字上的流量。但是,这会显着减慢进程的速度,因此它可能不适合进行分析。trussstracetrace
在最不透明的一端,有共享内存。共享内存的基本工作原理是访问在每个涉及的进程中是完全透明的,您只需要系统调用来设置共享内存区域。从外部跟踪这些内存访问会很困难,特别是如果您需要观察而不是扰乱时序。你可以试试Linux trace toolkit之类的工具(需要内核补丁),看看能不能提取出有用的信息;这是我希望 Solaris 拥有更好工具的领域(但我对此一无所知)。
如果您有源代码,那么最好的选择很可能是将跟踪语句添加到关键库函数中。LD_PRELOAD即使您没有(整个)源代码,只要您对访问共享内存的程序部分的控制流有足够的了解,这也可以通过技巧来实现。
这将显示进程读取和写入的内容:
strace -ewrite -p $PID
Run Code Online (Sandbox Code Playgroud)
它不是干净的输出(显示如下行: write(#,) ),但有效!(并且是单行 :D )您可能也不喜欢这样一个事实,即参数被缩写。要控制使用 -s 参数设置显示的字符串的最大长度。
它捕获所有流,因此您可能希望以某种方式对其进行过滤。
你可以过滤它:
strace -ewrite -p $PID 2>&1 | grep "write(1"
Run Code Online (Sandbox Code Playgroud)
仅显示描述符 1 调用。2>&1 是将 stderr 重定向到 stdout,因为 strace 默认写入 stderr。