当我查看 时ls -la /proc/<pid>/fd
,我发现 stdout 是到管道的链接:
lr-x------ 1 admin root 64 Jul 9 21:22 1 -> pipe:[1155]
这是什么意思?谁在听这管子?我怎样才能看到这个进程的标准输出?
答案1
借用自这个答案,这意味着PID为的进程的标准输出<pid>
已被重定向到管道(一种先进先出在文件系统层次结构中没有表示)。1155
是管道的 inode 号(在 Linux 上,您可以/proc/[pid]/fd/
在proc(5)
手册页了解更多信息)。
一个例子:
$ cat - | less
$ pgrep cat
187873
$ ls -l /proc/187873/fd/1
l-wx------ 1 user user 64 Jul 9 22:23 /proc/187873/fd/1 -> 'pipe:[1624839]'
的标准输出cat
被重定向到索引节点为 的管道的写入端1624839
,而 的标准输入less
被从其读取端重定向。
如果我们对连接到管道读取端的进程一无所知,我们可以搜索所有打开该管道的进程(但请注意,我们可能没有查看它们所需的权限):
$ fuser -v /proc/187873/fd/1
USER PID ACCESS COMMAND
/proc/187873/fd/1: user 187873 F.... cat
user 187874 f.... less
然后确认它less
已打开(用于阅读):
$ ls -l /proc/187874/fd/0
lr-x------ 1 user user 64 Jul 9 22:28 /proc/187874/fd/0 -> 'pipe:[1624839]'
答案2
您可以找到管道的另一端(如果进程仍然存在)
ls -l /proc/[1-9]*/fd 2>/dev/null | grep -B 3 -F 'pipe:[1155]'