监控进程间管道流量

监控进程间管道流量

我有两个 Linux 进程通过无名管道进行通信。如何监控管道中的流量?如何将数据注入管道?我有 root 访问权限,并且知道管道 inode。

答案1

无名管道本质上是拥有文件描述符的应用程序的私有财产。没有原则性的方法来观察或修改管道上的流量。我认为在 Linux 上也没有办法直接查看管道。

不过,有一种不讲原则的方法可以或多或少地实现你想要的效果:通过跟踪系统调用。你不会将管道本身附加到管道上,而是附加到某个进程上。为了进行观察,请使用斯特拉斯例如

strace -p1234 -s99999 -e write

管道上写入的进程的进程 ID 在哪里1234。修改数据比较困难,但可以做到。我认为最简单的方法是首先设置一个中间进程,将其标准输入复制到其标准输出,加上您要注入的数据(并减去您要抑制的任何数据)。创建两个命名管道,并在一个管道上使用 stdin 启动该中间进程,在另一个管道上使用 stdout。然后使用调试器(例如地理数据库) 使两个目标进程open在适当的命名管道上执行,然后dup将管道放在适当的文件描述符上。请注意,您可能会使进程中的一个进程崩溃。

(如果您不理解最后一段,我很抱歉,但它确实需要一定的技术水平。我认为没有更简单的方法。)

答案2

一些有助于监控管道的工具:

管道查看器
球座

对于已经运行的程序,其中无法控制管道,请参阅 gdb 方法:
重定向正在运行的进程的输出

或者可以使用斯特拉斯

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

仅显示描述符 1 调用。“2>&1”用于将 stderr 重定向到 stdout,因为 strace 默认写入 stderr。

答案3

如果任一进程在管道上阻塞(阻塞读取因另一个进程的写入而结束,或者阻塞写入因另一个进程的读取而结束,因为缓冲区已满),则会发生唤醒事件。您可以使用以下方法检测这些:

sudo perf record -a --call-graph dwarf -e 'sched:sched_wakeup' sleep 1

进而

sudo perf script -F trace:tid,comm,time,event,trace,sym,ip,dso > trace

跟踪文件会很长,但它会包含每个进程唤醒其他进程的时间戳。如果一切顺利,还会包含堆栈跟踪。

相关内容