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

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

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

有帮助吗?

解决方案

有是这里的几个选项。一个是重定向命令到一个文件的输出,然后使用“尾”以查看被添加到实时该文件的新行。

另一个选择是推出“屏幕”,这是一个排序的基于文本的终端应用程序的内部程序。屏幕会话可以安装和拆卸,而只是名义上指由同一用户使用,所以如果你想在用户之间共享,这是在屁股大的痛苦。

其他提示

我想我有一个简单的解决方案在这里。只要看看一个目录名对应于你正在寻找的PID,该/proc路径下可以访问的伪文件系统下。所以,如果你有一个程序的运行,一个ID为1199,cd到它:

$ cd /proc/1199

然后查找fd目录

的下面
$ cd fd

fd目录保存文件的描述,你的程序正在使用的对象(0:标准输入,1:标准输出,2:标准错误),只是tail -f一个你需要的 - 在这种情况下,标准输出):

$ tail -f 1

我一直在寻找这个确切的同样的事情,并发现你可以这样做:

strace -ewrite -p $PID

这不正是你所需要的,但它是相当密切的。

我尝试了重定向输出,但没有为我工作。 也许是因为进程被写入一个插座,我不知道。

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

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

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

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

基本上:

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

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

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

watch cat /dev/vcsa1

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

只要我的终端窗口是相同的宽度,该命令正在运行在终端的,我可以看到他们的当前每两秒钟输出的快照。其他命令推荐其他地方并没有对我的工作情况特别好,但一个没有的伎俩。

对我来说,这有效:

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

    ~$ su - process_owner
    
  2. 正如许多其他答案中提到的那样,尾部文件描述符。

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top