查看正在运行的进程的STDOUT重定向


17

如果我使用以下命令启动应用程序:

/path/to/my/command >> /var/log/command.log

而且该命令不返回,是否有办法从另一个提示中查看STDOUT重定向设置为什么?

我正在寻找类似的东西

cat /proc/PID/redirects

要么

ps -??? | grep PID

但是任何方法都可以。

Answers:


22

在中签出文件描述符#1(STDOUT)/proc/$PID/fd/。内核将此文件表示为指向描述符重定向到的文件的符号链接。

$ readlink -f /proc/20361/fd/1
/tmp/file

完善!谢谢!您能否提供有关其他重定向(例如STDERR)的链接或详细信息,即它们是哪个号码?
Rich

至少在Linux上(我相信在其他所有已知的类似UNIX的操作系统上),它们都是0:stdin,1:stdout,2:stderr(标准错误)。请注意,在<stdio.h>中还定义了C宏:STD {IN,OUT,ERR} _FILENO。有关详细信息,请参见“ man stdout”。
Petr Uzel

在所有类Unix / Unix系统中,分别为stdin,stdout和stderr分别确保0、1、2,在Windows上也是如此。
Paul Stelian

在MacOS上可以这样做吗?/ proc / <pid> / fd / 1不存在,也许我可以使用mkfifo吗?
亚历山大·米尔斯

4

一个有用的工具,可以查看通过什么进程打开了哪些文件lsof。您可以使用指向一个特定的过程lsof -p1234,并且您将看到与ls -l /proc/1234/fd在Linux下获得的信息几乎相同的信息,即打开了哪些文件。

最有用的lsof方法是反过来:lsof /path/to/file告诉您哪些进程正在使用该文件。


1

许多答案提到这样做:

tail -f /proc/{PID}/fd/1

但是,我发现它并不总是有效。或者,cat有时会产生结果。

cat /proc/{PID}/fd/1

其中可以使用ps aux命令查找{PID} 。

值得一提的是,命令末尾的数字(在本例中为fd / 1)可以更改为其他输出。

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.