重定向/grep 现有 shell 的 STDOUT

重定向/grep 现有 shell 的 STDOUT

我运行了很多长时间运行的进程(模拟),将进度打印到STDOUT.我偶尔会忘记重定向STDOUT到一个我可以重定向到的文件grep,而且通常会因为时间太长而无法重新启动。

问题:在不停止进程的情况下,有没有办法可以连接到另一个进程STDOUT

它们始终在 OS X 10.7.3 上的 ZSH 的 GNU 屏幕中运行。

答案1

有一个聪明的黑客提及这里使用 GDB 附加到进程,以及一个名为dupx总结了这个功能。

来自dupx 联机帮助页:

Dupx 是一个简单的实用程序,用于重新映射已运行程序的文件。像 Bash 这样的 shell 允许在程序启动时使用>, < -类似的语法轻松进行输入/输出/错误重定向,例如:echo 'redirect this text' > /tmp/stdout将重定向输出echo/tmp/stdout

然而,标准 shell 不提供为已启动的进程重新映射(重定向)输出(或输入或错误)的功能。 Dupx 试图通过使用dup(2)内部系统调用来解决这个问题gdb(1)。 Dupx 目前被实现为gdb脚本的简单 shell 包装器。

答案2

使用 screen 的log命令(!)

由于该进程已经在屏幕会话中运行,因此只需告诉屏幕记录该窗口的输出即可:

切换到脚本的窗口,C-a H进行记录。
现在你可以 :

$ tail -f screenlog.2 | grep whatever

从屏幕的手册页:

记录[开|关]

开始/停止将当前窗口的输出写入窗口默认目录中的文件“screenlog.n”,其中n是当前窗口的编号。可以使用“logfile”命令更改此文件名。如果未给出参数,则切换日志记录状态。如果文件已存在,则会话日志将附加到文件的先前内容中。当前内容和回滚历史记录的内容不包含在会话日志中。默认为“关闭”。

相关内容