web-dev-qa-db-ja.com

FreeBSD / macOSで実行中のプロセスの標準入出力を取得します

Linuxでは、実行中のプロセスの/proc/<pid>/fd/[0,1,2]にアクセスするためにstd[in,out,err]をよく使用します。

FreeBSDやmacOSで同じ結果を達成する方法はありますか?

5
M4rty

これに対するdtraceベースの回答については、 このStackOverflowリンク を参照してください。 FreeBSDでテストしましたが、完全に機能します。

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

procfs はFreeBSDでも利用できますが、manページからはfdが実装されていないようです。 Procfsは通常、Linux互換性のためにFreeBSDでのみ使用されます。

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)を使用できます。これは package として利用できます。

移植性が懸念される場合は、 ファイル記述子リンクの移植性 を読む必要があります。それはすべての拠点をカバーしています。

0
Claus Andersen