在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)可作为包裹。
如果您关心可移植性,您应该阅读文件描述符链接的可移植性。它涵盖了所有基地。