请注意,管道的一端可能同时在多个进程中打开(通过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 上使用,您可以确定谁在管道的另一端。
找出(从 Bash 脚本中)哪些 pids 和 fds 连接到特定管道的疯狂黑客方式:
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
}
然后,如果您想找出系统上的哪些 fd 连接到您的脚本的标准输入:
find_fd_target `get_fd_target $$ 0`