是否可以使用其PID读取任何进程的输出?


32

是否可以通过使用终端的PID以类似于使用fg作业命令的方式将终端连接到已经运行的进程?


像什么?!您要附加的流程是什么?!

我希望能够查看在另一个终端中启动的程序的输出
Tommy

Answers:


43

您可以获取该进程的标准文件描述符,例如stdout

tail -f /proc/<pid>/fd/1

8
我用top尝试了此解决方案,但似乎没有用。在一个终端中,我启动了top,在另一个终端中,我将您的命令与corred pid一起使用,但没有输出。
汤米

1
您如何在Mac上执行此操作?
Avner Barr

那stderr呢?我假设/ proc / <pid> / fd / 2,但是如何同时获得stdout / stderr?
亚历山大·米尔斯

1
如果此描述符指向套接字该怎么办?尾巴看不懂。# ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar说恢复莫妮卡

8

这里有一些选择。一种是将命令的输出重定向到文件,然后用于tail查看实时添加到该文件的新行。

另一个选择是在中启动您的程序screen,这是一种基于文本的终端应用程序。屏幕会话可以进行附加和分离,但名义上只能由同一用户使用,因此,如果要在用户之间共享它们。

否则,如果您愿意,您可以跟踪该过程并查看它的作用strace

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID:使用进程ID PID附加到进程并开始跟踪。
  • -s SIZE:指定要打印的最大字符串大小(默认为32)。
  • -o filename:将跟踪输出写入文件名而不是屏幕(stderr)。

最后,它似乎不起作用。我启动了top,然后在另一个命令中将您的命令与corred pid一起使用,但未获得预期的输出。当我以后使用尾巴时。
汤米2012年

您需要sudo与strace 一起使用来附加到进程,并使用它,-o ~/output.txt以便将该文件保留在主文件夹中。

使用输出文件,不要发送到屏幕!不要像我一样成为白痴,然后按Ctrl-C脱离strace,然后分离我的PID。在重要的剧本上吓到我了。
Weston Ganger 18年

3

您可以使用下面给出的这些命令在另一个终端上附加一个正在运行的进程:

  • retty(手册页:retty
  • reptyr
  • screen

例:

screen -S PID
retty $(pgrep PID)
reptyr PID

我找不到retty或reptry。另外,为了能够使用屏幕,我必须使用它启动原始过程,这样它才能解决我的问题。
Tommy

您可以使用命令安装它,sudo apt-get install retty但是retty几乎没有限制。查看答案中提到的手册页。
devav2 2012年
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.