附加到流程输出以供查看

agg*_*tan 103 linux logging command-line-interface

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

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

通常,如果你使用命令行启动一个健谈的应用程序,你会看到各种精彩的输出.但是,让我说我有一个特别繁琐的编程运行像KINO,我想在任何给定时刻查看其输出,而不通过命令行重新启动它我不能,至少我不知道如何.

lic*_*rna 261

我想我在这里有一个更简单的解决方案,只需在/proc路径下可访问的伪文件系统下查找名称对应于您正在寻找的PID的指示.所以如果你有一个运行的程序,其ID为1199,请进入:

$ cd /proc/1199
Run Code Online (Sandbox Code Playgroud)

然后查找cd下面的目录

$ cd fd
Run Code Online (Sandbox Code Playgroud)

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

$ tail -f 1
Run Code Online (Sandbox Code Playgroud)

  • 我无法使用`tail`,因为在我的情况下,输出被重定向到另一个进程进行输入,但是`more`向我显示了当前的数据. (8认同)
  • 这个网站上最铆钉的帖子之一! (8认同)
  • 这对于调用 System.out.println 的 java 进程不起作用。/proc/[pid]/fd/1 根本没有输出 (5认同)
  • `more`对我有用.ubuntu 14.04关于节点进程 (2认同)
  • 如果进程已经分配了 tty,这将起作用。您可以使用“ps”命令检查 tty 是否已分配。如果 TTY 列中显示“?”,则没有分配 tty,则 /proc/PID/fd 中没有任何内容可检查。 (2认同)

Pau*_*ema 51

我正在寻找同样的东西,并发现你可以这样做:

strace -ewrite -p $PID
Run Code Online (Sandbox Code Playgroud)

不完全是你所需要的,但它非常接近

我尝试重定向输出,但这对我没用,maby因为进程正在写入套接字,我不知道

  • @izy,您可以指定“-sLENGTH”标志来设置新的缓冲区大小(默认为 32)。有关更多详细信息,请查看 https://unix.stackexchange.com/a/58601 (4认同)

Don*_*rve 15

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

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

  • 您可能需要tail -f $ log_file来获取输出,因为它是在文件中写入的.此外,不,我不知道如何使用已经运行的应用程序. (2认同)

akk*_*kki 9

对我来说,这有效:

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

    ~$ su - process_owner
    
    Run Code Online (Sandbox Code Playgroud)
  2. 尾随许多其他答案中提到的文件描述符。

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

  • 如果文件描述符指向套接字怎么办?`# ls -la /proc/24510/fd/1 lrwx-------- 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -&gt; 套接字:[444026]` (4认同)

Zhi*_*ang 8

您可以使用reptyr

sudo apt install reptyr
reptyr pid
Run Code Online (Sandbox Code Playgroud)

  • 如果 `reptyr $PID` 不起作用,请尝试基于此[问题]的 `sudo reptyr -T $PID`(https://github.com/nelhage/reptyr/issues/62#issuecomment-138653405) (2认同)

yve*_*mes 7

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

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

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

重定向输出从 - 一个运行的进程

基本上:

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

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