在 FreeBSD/macOS 下抓取正在运行的进程的标准输入/输出

在 FreeBSD/macOS 下抓取正在运行的进程的标准输入/输出

在Linux下我经常用来/proc/<pid>/fd/[0,1,2]访问std[in,out,err]任何正在运行的进程。

有没有办法在 FreeBSD 和/或 macOS 下达到相同的结果?

答案1

这个 StackOverflow 链接对此的基于 dtrace 的答案。我已经在 FreeBSD 上测试过了,它运行得很好:

    capture() {
        sudo dtrace -p "$1" -qn '
            syscall::write*:entry
            /pid == $target && arg0 == 1/ {
                printf("%s", copyinstr(arg1, arg2));
            }   
        '   
    }   

答案2

进程文件系统在 FreeBSD 中也可用,但从手册页来看似乎fd尚未实现。 Procfs 通常仅在 FreeBSD 中用于 Linux 兼容性。

FreeBSD 上 procfs 的本机替换是程序统计您可以将其与-f参数一起使用来获取文件描述符:

procstat -a -f

另一个识别活动文件的本机工具是统计数据。如果需要,请记住-m内存映射文件。

fstat -m

如果您喜欢使用文件系统,那么我们有开发文件系统这暴露了fdescfs你可以访问FD以您要求的方式。

ls /dev/fd

例子:

echo -n Hello > hello.txt
echo " World!" | cat hello.txt /dev/fd/0

如果您也想要跨系统移植到 Mac 的工具 - 那么您可以使用该工具拉索夫(LiSt Open Files)可作为包裹

如果您关心可移植性,您应该阅读文件描述符链接的可移植性。它涵盖了所有基地。

相关内容