附加到流程输出以进行查看


111

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

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

通常,如果使用命令行启动健谈的应用程序,则可以看到各种精彩的输出。但是,比方说,我运行的是一个特别健谈的编程程序,例如KINO,并且我想在任何给定的时间查看其输出,而不必通过命令行重新启动它。我不能; 至少我不知道如何。


1
您的过程中是否有调试符号?它是否在生产环境中运行?如果是这样,您是否需要它永远不会被暂停?
Yves Baumes,09年

当我对诸如kino之类的最终用户程序遇到稳定性问题(崩溃并杀死我的声音)时,我希望能够知道它为何/为何崩溃,因此我可以进行修复。这不是我正在开发的程序,而是我想知道的解决故障的技术。我会在下面尝试您的建议。
aggitan

Answers:


17

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

另一个选择是在“屏幕”内部启动程序,“屏幕”是一种基于文本的终端应用程序。屏幕会话可以连接和分离,但名义上只能由同一用户使用,因此,如果要在用户之间共享屏幕会话,那就麻烦了。


1
“这里有一些选择。一种是将命令的输出重定向到文件,然后使用'tail'来实时查看添加到该文件的新行。” 可以使用已经运行的应用程序完成此操作吗?
aggitan

2
您可能需要tail -f $ log_file来获取输出,该输出已写入文件中。此外,不,我不知道如何使用已经运行的应用程序执行此操作。
瓦汉2009年

@aggitan:否。对于现有应用程序,您必须重新启动它们,因为它们已经将其I / O绑定到控制终端。
Don Werve


288

我想我在这里有一个更简单的解决方案。只需在该/proc路径下可访问的伪文件系统下,找到一个名称与要查找的PID相对应的目录。因此,如果您正在运行一个ID为1199的程序cd

$ cd /proc/1199

然后在fd下面寻找目录

$ cd fd

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

$ tail -f 1

9
我无法使用,tail因为在我的情况下,输出已重定向到另一个进程进行输入,但more向我显示了当前数据。
–Ωmega13年

10
这个网站上最吸引人的帖子之一!
罗伯特

2
more为我工作。ubuntu 14.04在节点进程上
Shih-Min Lee

1
这对于使用System.out.println的Java进程不起作用。根本没有输出到/ proc / [pid] / fd / 1
尼克,

1
尝试使用以下内容创建复制品,但无济于事: COUNT ++));睡眠1;回显\“计数为:\ $ {COUNT} \”;完成;“ 在另一个终端:docker exec -it container1 tail -f / proc / 1 / fd / 1
JacobWuzHere

54

我一直在寻找相同的东西,发现可以做到:

strace -ewrite -p $PID

这不是您所需要的,但是非常接近。

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


谢谢,它的工作原理,但输出被截断,例如用于ping:write(1,“来自1.0.0.1的64个字节:icmp_seq =” ...,56)= 56
izy

8

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

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

尽管我从未尝试过,但我发现了一篇有趣的文章,其中介绍了如何使用GDB(并且无需重新启动过程)。

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

基本上:

  1. 由于/ proc / xxx / fd,请检查您的进程的打开文件列表
  2. 连接使用GDB流程
  3. 暂停时,关闭您感兴趣的文件,调用close()函数(您可以在GDB中使用任何函数。我怀疑您的进程中需要调试符号。)
  4. 打开一个新文件,调用create()或open()函数。(最后查看注释,您会看到人们建议使用dup2()以确保将使用相同的句柄)
  5. 分离过程并开始运行。

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


6

对我来说,这可行:

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

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

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

2

我想远程观看在本地运行的yum升级过程,因此虽然可能有更有效的方法来做到这一点,但我的工作是:

watch cat /dev/vcsa1

显然,您要使用vcsa2,vcsa3等,具体取决于所使用的终端。

只要我的终端窗口的宽度与运行该命令的终端的宽度相同,我就可以每两秒钟看到其当前输出的快照。在其他地方推荐的其他命令在我的情况下效果不是很好,但是可以解决问题。

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.