我使用 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