观察通过管道传输到 /dev/null 的输出

观察通过管道传输到 /dev/null 的输出

我有一些科学程序,可以运行几分钟到几天。该程序将进度信息打印到 stdout,并以回车符结尾。

如果程序运行几天,我通常将输出通过管道传输到 /dev/null 以避免巨大的日志文件。

有没有办法定期观察程序的输出,而不必保留所有生成的文本?

答案1

您应该 ssh 到服务器,然后运行screen以启动会话。从那里启动长时间运行的科学程序(使其正常输出到标准输出),然后随时断开连接。每当您想查看输出时,请再次 ssh 返回服务器并运行screen -R以重新附加到最后一个分离的会话。

您也可以使用tmux代替screen,其工作原理类似。只需运行tmux attach-session而不是screen -R.

对您的科学程序实例执行相同的操作不是已在屏幕会话中启动:找到程序 PID,然后运行:

screen
reptyr <PID>

将其重新连接到新的屏幕会话。

答案2

我刚刚在这个确切的问题领域开发了一个新的解决方案:pw(管道监视)实用程序

这是一个小型的、BSD 许可的 C 程序,单个文件中不到 2000 行,没有库依赖项,生成一个占用内存较小的小型可执行文件。

pw不断读取其标准输入,因此它会吃掉所有内容,就像/dev/null.它将输入行传递到内部 FIFO 缓冲区,对缓冲区进行采样以创建更新显示。

pw检测到它已被 shell 作业控制置于后台时,它仍然读取其输入,但不会刷新显示。

这真的很简单:

yourlongrunningprogram | pw &

然后fg进入前台查看最新输出;Ctrl-Zbg再次在后台运行。

pw有一些不错的交互功能:过滤、触发、分屏操作、快照历史记录的调用。用户界面是 Vi 的模因:有:冒号命令等。有些命令有数字前缀,重复命令是用 完成的.

假设您已经运行程序几个小时或几天,并确定其输出的某些部分没有提供信息。没问题,只是:v pattern和不匹配的行pattern现在被拒绝。

最近开发的功能是您可以将状态保存pw到文件中。如果您以某种方式交互设置,您可以轻松地从保存的文件中重现该设置:所有过滤器、触发器、分屏配置和其他参数。

相关内容