130

我如何将控制台/终端视图“附加”到应用程序输出,以便我可以看到它可能在说什么?

如何在不终止应用程序的情况下从应用程序输出中分离?

通常,如果您使用命令行启动一个健谈的应用程序,您会看到各种精彩的输出。但是,假设我正在运行一个特别健谈的程序,例如 KINO,并且我想在任何给定时刻查看它的输出,而无需通过命令行重新启动它。我不能; 至少我不知道怎么做。

4

7 回答 7

352

我想我在这里有一个更简单的解决方案。/proc只需在路径下可访问的伪文件系统下查找名称与您要查找的 PID 对应的目录。所以如果你有一个程序正在运行,它的 ID 是 1199,cd进入它:

$ cd /proc/1199

然后查找fd下面的目录

$ cd fd

fd目录包含您的程序正在使用的文件描述符对象(0:stdin,1:stdout,2:stderr)以及tail -f您需要的对象 - 在本例中为 stdout):

$ tail -f 1
于 2013-07-22T14:51:51.047 回答
61

我一直在寻找完全相同的东西,发现您可以这样做:

strace -ewrite -p $PID

这不完全是您需要的,但它非常接近。

我尝试了重定向输出,但这对我不起作用。也许是因为该进程正在写入套接字,我不知道。

于 2012-12-07T13:17:14.530 回答
21

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

另一种选择是在“屏幕”内启动您的程序,这是一种基于文本的终端应用程序。屏幕会话可以附加和分离,但名义上只能由同一个用户使用,所以如果你想在用户之间共享它们,那就太麻烦了。

于 2009-04-03T21:20:31.543 回答
12

对我来说,这有效:

  1. 以进程所有者身份登录(甚至root被拒绝权限)

    ~$ su - process_owner
    
  2. 如许多其他答案中所述,跟踪文件描述符。

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    
于 2019-08-21T09:11:08.040 回答
9

您可以使用reptyr

sudo apt install reptyr
reptyr pid
于 2020-09-16T06:15:03.817 回答
8

我如何将控制台/终端视图“附加”到应用程序输出,以便我可以看到它可能在说什么?

关于这个问题,我知道即使您在启动进程之前没有启动 sceen 命令,也可以捕获输出。

虽然我从未尝试过,但我发现了一篇有趣的文章,它解释了如何使用 GDB(并且无需重新启动进程)。

从运行过程中重定向输出

基本上:

  1. 检查您的进程的打开文件列表,感谢/proc/xxx/fd
  2. 使用 GDB附加您的流程
  3. 暂停时,关闭您感兴趣的文件,调用close()函数(您可以在 GDB 中使用您的进程的任何函数。我怀疑您的进程中需要调试符号..)
  4. 打开调用create()或 open() 函数的新文件。(看看最后的评论,你会看到人们建议使用dup2()来确保使用相同的句柄)
  5. 分离进程并让其运行。

顺便说一句,如果您在 i386 机器上运行 linux 操作系统,评论正在谈论将输出重定向到新控制台的更好工具:'retty'。如果是这样,请考虑使用它。

于 2009-04-03T22:38:00.967 回答
3

我想远程观看本地运行的 yum 升级过程,所以虽然可能有更有效的方法可以做到这一点,但我是这样做的:

watch cat /dev/vcsa1

显然你会想要使用 vcsa2、vcsa3 等,这取决于正在使用的终端。

只要我的终端窗口与运行命令的终端具有相同的宽度,我就可以每两秒看到它们当前输出的快照。其他地方推荐的其他命令对我的情况并不特别有效,但是那个成功了。

于 2014-10-08T02:40:31.217 回答