我有一些科学程序,可以运行几分钟到几天。该程序将进度信息打印到 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-Z并bg
再次在后台运行。
pw
有一些不错的交互功能:过滤、触发、分屏操作、快照历史记录的调用。用户界面是 Vi 的模因:有:
冒号命令等。有些命令有数字前缀,重复命令是用 完成的.
。
假设您已经运行程序几个小时或几天,并确定其输出的某些部分没有提供信息。没问题,只是:v pattern
和不匹配的行pattern
现在被拒绝。
最近开发的功能是您可以将状态保存pw
到文件中。如果您以某种方式交互设置,您可以轻松地从保存的文件中重现该设置:所有过滤器、触发器、分屏配置和其他参数。