我运行了很多长时间运行的进程(模拟),将进度打印到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”命令更改此文件名。如果未给出参数,则切换日志记录状态。如果文件已存在,则会话日志将附加到文件的先前内容中。当前内容和回滚历史记录的内容不包含在会话日志中。默认为“关闭”。