附加到用于查看的进程输出

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

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

通常情况下,如果您使用命令行启动一个健谈的应用程序,您将看到各种精彩的输出。但是,假设我运行了一个特别冗长的编程,比如 KINO,我想在任何给定的时刻查看它的输出,而不需要通过命令行重新启动它。我不能,至少我不知道怎么做。

176664 次浏览

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

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

我如何“连接”一个 控制台/终端-到 应用程序输出,所以我可以看到什么 它可能在说什么?

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

虽然我从来没有尝试过,但是我发现了一篇有趣的文章,解释了如何使用 GDB (并且不需要重新启动流程)。

从正在运行的进程重定向输出

基本上:

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

顺便说一下,如果您在 i386机器上运行 linux 操作系统,注释中提到了一个更好的工具,可以将输出重定向到一个新的控制台: “ retty”。如果是这样,考虑一下它的用途。

我也在寻找同样的东西,结果发现你可以做到:

strace -ewrite -p $PID

虽然不是你想要的,但也差不多了。

我试过重定向输出,但是没有用。 也许是因为这个过程是写入套接字的,我不知道。

我有个更简单的解决办法。只需在 /proc路径下可访问的伪文件系统下查找名称与您要查找的 PID 相对应的目录。因此,如果你有一个程序运行,其 ID 是1199,cd到它:

$ cd /proc/1199

然后查找下面的 fd目录

$ cd fd

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

$ tail -f 1

我想远程观看百胜在本地运行的升级过程,因此,尽管可能有更有效的方法来做到这一点,但我所做的是:

watch cat /dev/vcsa1

显然,您希望使用 vcsa2、 vcsa3等,这取决于所使用的终端。

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

对我来说,这个方法奏效了:

  1. 作为进程的所有者登录(甚至拒绝 root的权限)

    ~$ su - process_owner
    
  2. Tail the file descriptor as mentioned in many other answers.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

你可以使用 reptyr:

sudo apt install reptyr
reptyr pid

一个更简单的选择是 cat:

cat /proc/<pid>/fd/1

特别是如果由于权限错误(甚至使用 sudo) ,tail不能为您工作,或者如果监视进程使用诅咒或等效库显示进度条。