0

次のパイプラインがあるとしましょう。

$ generator_process | filter_process | storage_process

filter_processのpidを見つけることは可能ですか?もしそうなら、どのように?そうでない場合、なぜですか?generator_processstorage_process

より一般的には、プロセスはパイプを介して通信するプロセスのpidをどのように見つけることができますか?

これを行うためのポータブル(POSIX)の方法を探していますが、プラットフォーム固有のトリックが必要な場合は、Linuxソリューションが私が探しているものです。Cでの答えが最も詳細になると思いますが、シェルが関係している場合は、bashソリューションを探しています。

filter_process私は変更できますがgenerator_process、変更する可能性や希望がないプログラムであると想定してくださいstorage_process(これらは、私がいじりたくない標準のUnixツールである可能性があります)。また、pidをディスクに書き込むスクリプトでそれらをラップすることは、私が求めている解決策ではありません。

4

1 に答える 1

2

パイプの一方の端が複数のプロセスで同時に開かれている可能性があることに注意してください (fork()またはsendmsgファイル記述子の送信を介して)。

Linux では、何が開いているかを調べることができます/proc/<pid>/fd(fdsターゲットrootプロセスと同じ uid である必要があります)。実行grep a | grep bしたところ、次の出力が得られました。

/proc/10442/fd:
total 0
dr-x------ 2 nneonneo nneonneo  0 Sep 20 02:19 .
dr-xr-xr-x 7 nneonneo nneonneo  0 Sep 20 02:19 ..
lrwx------ 1 nneonneo nneonneo 64 Sep 20 02:19 0 -> /dev/pts/5
l-wx------ 1 nneonneo nneonneo 64 Sep 20 02:19 1 -> pipe:[100815116]
lrwx------ 1 nneonneo nneonneo 64 Sep 20 02:19 2 -> /dev/pts/5

/proc/10443/fd:
total 0
dr-x------ 2 nneonneo nneonneo  0 Sep 20 02:19 .
dr-xr-xr-x 7 nneonneo nneonneo  0 Sep 20 02:19 ..
lr-x------ 1 nneonneo nneonneo 64 Sep 20 02:19 0 -> pipe:[100815116]
lrwx------ 1 nneonneo nneonneo 64 Sep 20 02:19 1 -> /dev/pts/5
lrwx------ 1 nneonneo nneonneo 64 Sep 20 02:19 2 -> /dev/pts/5

したがってreadlink、自分のプロセスの fd を使用し、続いて自分readlinkが所有する他のプロセスの fd を使用することで、パイプの反対側に誰がいるかを把握できます。

どの pid と fd が特定のパイプに接続されているかを (Bash スクリプト内から) 見つけるための非常にハックな方法:

get_fd_target() {
    pid=$1
    fd=$2
    readlink /proc/$pid/fd/$fd
}

find_fd_target() {
    target=$1
    for i in /proc/*/fd/*; do
        if [ "`readlink $i`" == "$target" ]; then
            echo $i
        fi
    done
}

次に、システム上のどの fds がスクリプトの標準入力に接続されているかを調べたい場合は、次のようにします。

find_fd_target `get_fd_target $$ 0`
于 2012-09-20T06:22:01.223 に答える