![查看进程的输出被重定向到什么位置](https://linux22.com/image/182062/%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E7%9A%84%E8%BE%93%E5%87%BA%E8%A2%AB%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E4%BB%80%E4%B9%88%E4%BD%8D%E7%BD%AE.png)
我有一个进程应该将其输出重定向到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
以查看另一端的进程。