在我的示例中,wc
程序正在尝试打开测试 FIFO 或命名管道。
这些正在进行的系统调用似乎没有通过或open
显示:fuser
lsof
mknod /tmp/testpipe p
wc /tmp/testpipe &
timeout 0.2 strace -p $! |& timeout 0.1 cat; echo
strace: Process 10103 attached
open("/tmp/testpipe", O_RDONLY
fuser /tmp/testpipe # no output
lsof | grep testpipe # no output
如何在 Linux 系统中查找尝试打开某些 FIFO 的进程?
正如您所暗示的,您看到的挑战是调用
open()
尚未完成;它正在阻塞,等待写入器打开。由于管道尚未打开,因此它不会显示在fuser
或lsof
中/proc/<pid>/fd
;没有文件句柄与之关联!我们可以看到哪些进程正在等待管道打开;例如
因此我们可以看到 PID 12104 正在等待管道,但这并没有告诉我们哪个管道。但我们可以利用这些信息以及
timeout strace
您已经使用过的信息来查看...例如
输出结果类似如下
由于 的出现,这里假设 Linux
strace
。但您并未指定。*BSD 系统也存在类似的机制。在我看来,您需要挂接到每个
open
调用并捕获打开路径的调用。您可以使用 ebpf 以相对较低的开销做到这一点。bpftools
包 shipbpftrace
可以解释执行此操作的脚本。事实上,如果你
bpftrace
在系统上安装,你可能会发现 /usr/share/bpftrace/tools 目录中有很多示例。你可以直接opensnoop
从那里运行!