查看进程的输出被重定向到什么位置

查看进程的输出被重定向到什么位置

我有一个进程应该将其输出重定向到output.txt。不幸的是,输出不会发送到该文件。首先,我检查是否从另一个目录调用它,但除了输出应该去的地方之外,没有output.txt。因此,我检查了输出sudo tail -f /proc/2027/fd/1,发现该过程运行良好并且具有有效的输出。另外,我非常确定我正在正确地开始该过程,因为它已经起作用了,并且我没有对此进行任何更改。我现在的问题是该过程的输出去了哪里?我只能找到解决方案来查看输出,如下所示:如何在另一个 bash 会话中查看正在运行的进程的输出?。但我想看看输出被重定向到哪里。为了完整起见,以下是我在 java 中启动该过程的方法:

ProcessBuilder builder = new ProcessBuilder("java", "-jar", "variobox.jar");
builder.redirectOutput(new File("out.txt"));
builder.redirectError(new File ("error.txt"));
builder.start();

答案1

您非常接近地展示了/proc/$pid/fd/1.正如您所看到的,这将显示发送到 stdout 的输出。但要看到从今以后正在发送标准输出,您只需查看该符号链接的目标:

$ sleep 20 & pid=$!
[1] 88972
$ readlink -f /proc/$pid/fd/1
/dev/pty0
$  sleep 20 > /dev/null & pid=$!
[1] 99996
readlink -f /proc/$pid/fd/1
/dev/null

如果链接的目标是管道并且您想查找另一端的内容,请参阅unix 管道另一端的进程名称?。如果链接的目标是套接字并且您想查找另一端的内容,请参阅谁有这个 unix 套接字对的另一端?

但是,如果您看到的输出不是发送到output.txt文件的输出,则似乎表明您看到的输出是不是事实上输出(或更具体地说不是标准输出)。它可能是标准错误,即文件描述符2

答案2

可移植的是,您可以使用:

lsof -ad 1 -p "$pid"

查看 id 进程的 fd 1 (stdout) 上打开的内容$pid

如果它对管道或另一个进程间通信通道开放,则在 Linux 上,您可以添加选项-E以查看另一端的进程。

相关内容