GNU 屏幕复制模式阻止执行吗?

GNU 屏幕复制模式阻止执行吗?

我使用 GNU Screen 的回滚/复制模式。所以我按 Control-A [ 进入复制模式,向上滚动到我关心的部分...然后我忘记了。

但是,似乎将 GNU screen 置于回滚/复制模式会阻止执行(无论当时正在运行什么应用程序)。例如,如果我在回滚/复制模式下启动本地 Web 服务器,则对该 Web 服务器发出的请求将超时:直到我退出复制/回滚模式,该进程才会响应。

我在 Ruby On Rails 脚本/服务器和 Python 工具 Paste 中都看到过这种情况。

我曾考虑过为我的窗口打开日志记录模式,然后只是通过这些日志文件进行跟踪/grepping,但如果可以通过其他方式控制(设置,以不同的方式激活复制模式)我会非常感兴趣。

我的屏幕版本显示:

屏幕版本 4.00.03 (FAU) 2006 年 10 月 23 日

(我在 quora.com 上问过这个问题,但也许这里是更好的地方)

答案1

进程阻塞的原因是,当您处于复制粘贴模式时,screen 会阻塞进程的输出管道。我认为这不是一个真正的错误,因为实际上您要求 screen 在您复制/粘贴时在其缓冲区中存储可能无限量的信息。如果您希望让程序的输出通过,但又能够偶尔暂停它,请尝试此方法。

program > logfile 2>&1 & 
less logfile

2>&1 将合并程序中的 stderr 和 stdout。& 将程序发送到后台。如果需要,请使用 fg 将其带到前台。现在按 F 跟踪日志文件的末尾,因为它会随着 less 的增长而增长。如果您需要停止并检查某些内容,请按 ctrl+c,然后按 F 再次跟踪。您还可以按 & 将 less 中的可见行限制为正则表达式。在浏览日志文件时非常方便。

答案2

我怀疑如果不修改屏幕就没有解决方案,但我制作了这个scroll.py脚本来至少演示了这个问题:

#!/usr/bin/env python3
import time
with open("/tmp/scroll", mode="w") as f:
    t1 = time.time()
    while True:
        t2 = time.time()
        tdiff = t2 - t1
        t1 = t2
        text = f"tdiff={tdiff} {'!!!!!!!!' if tdiff > 0.5 else ''}"
        print(text, flush=True)
        print(text, flush=True, file=f)
        time.sleep(0.01)

./scroll.py在屏幕会话和tail -f /tmp/scroll另一个终端中运行。按Ctrl-A ESC进入复制模式。几秒钟后,tail输出冻结,退出复制模式会生成以下输出:

tdiff=0.010303020477294922 
tdiff=5.808627605438232 !!!!!!!!
tdiff=0.010957002639770508 

错误报告:https://savannah.gnu.org/bugs/index.php?63341

相关内容