如何找到进程打开的管道对应的文件?

如何找到进程打开的管道对应的文件?

我创建了这个脚本,它侦听硬编码管道上接收到的字符,并尝试eval这些字符。我将我的脚本称为loop_executor.sh 这就是它包含的全部内容:

!/bin/bash

while :
do
    x=`cat /tmp/console_test`;
    echo "received $x"
    eval $x
done;

我双击执行我的脚本。

我想看看这个进程打开了哪些文件:

> $ pgrep loop_executor.sh
1234

> $ ll /proc/1234/fd
dr-x------ 2 userX domain^users  0 Oct 20 17:57 ./
dr-xr-xr-x 9 userX domain^users  0 Oct 20 17:57 ../
lr-x------ 1 userX domain^users 64 Oct 20 17:57 0 -> /dev/null
l-wx------ 1 userX domain^users 64 Oct 20 17:57 1 -> /dev/null
l-wx------ 1 userX domain^users 64 Oct 20 17:57 2 -> /home/local/groupX/userX/.xsession-errors
lr-x------ 1 userX domain^users 64 Oct 20 17:58 255 -> /home/local/groupX/userX/Desktop/loop_executor.sh*
lr-x------ 1 userX domain^users 64 Oct 20 17:57 3 -> pipe:[225812]

FD 3 指向“管道”。好吧,我知道它使用什么文件,因为我是在脚本中硬编码该文件的人,但我想从另一个来源获取此信息(如果可能)(因为我的脚本只是一个 POC,它可以是一个其代码不对我开放的进程)。

我的理解是,它pipe:[225812]并不指向我的文件的索引节点。

ll -i /tmp/console_test 
16519395 prw-r--r-- 1 userX domain^users 0 Oct 20 18:14 /tmp/console_test|

所以我的问题是:如果进程可以打开管道(我的系统上的文件),我可以确定这些管道“对应”哪些文件吗?

如果重要的话,我正在使用 ubuntu 12.04。

[编辑] 找到cat从我的管道中读取的进程。它与其父进程具有相同的打开管道,因此这里没有太大区别 - >我仍然不知道只是通过查看pipe:[225812]什么文件 - 如果有的话 - 那是。

答案1

您的脚本尚未/tmp/console_test打开,但cat进程已打开。您的脚本正在从连接到进程的管道中读取数据cat;这就是你在问题中看到的。

搜索该cat进程并检查该进程。

你可能想要这样的东西:

while read x; do
    echo "received $x"
    eval "$x"
done < /tmp/console_test

请注意参数周围添加的引号eval

相关内容