Process
在 FreeBSD/macOS 下獲取正在執行的程序的標準輸入/輸出
在 Linux 下我經常
/proc/<pid>/fd/[0,1,2]
用來訪問std[in,out,err]
任何正在執行的程序。有沒有辦法在 FreeBSD 和/或 macOS 下獲得相同的結果?
有關此問題的基於 dtrace 的答案,請參閱此 StackOverflow 連結。我已經在 FreeBSD 上對其進行了測試,並且效果很好:
capture() { sudo dtrace -p "$1" -qn ' syscall::write*:entry /pid == $target && arg0 == 1/ { printf("%s", copyinstr(arg1, arg2)); } ' }
procfs在 FreeBSD 中也可用,但從手冊頁看來,它似乎
fd
沒有實現。Procfs 通常只在 FreeBSD 中用於 Linux 兼容性。FreeBSD 上 procfs 的本機替換是procstat,您可以將其與
-f
參數一起使用以獲取文件描述符:procstat -a -f
另一個辨識活動文件的本地工具是fstat。如果需要,請記住
-m
記憶體映射文件。fstat -m
如果你喜歡通過文件系統工作,那麼我們有devfs,它公開了 fdescfs,你可以按照你要求的方式訪問fd。
ls /dev/fd
例子:
echo -n Hello > hello.txt echo " World!" | cat hello.txt /dev/fd/0
如果您還想要一些可以跨系統移植到 Mac 的東西,那麼您可以使用工具lsof (LiSt Open Files),它作為一個包提供。
如果關注可移植性,您應該閱讀文件描述符連結的可移植性。它涵蓋了所有基礎。