Process

在 FreeBSD/macOS 下獲取正在執行的程序的標準輸入/輸出

  • May 24, 2017

在 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),它作為一個提供。

如果關注可移植性,您應該閱讀文件描述符連結的可移植性。它涵蓋了所有基礎。

引用自:https://unix.stackexchange.com/questions/363899