パイプの一方の端が複数のプロセスで同時に開かれている可能性があることに注意してください (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`