我们在生产中拥有屏幕运行的应用程序。 (我有一种感觉,有些人可能会建议反对它,但它确实对我们来说效果很好,但是......)如果我在复制模式下向上滚动然后分离,忘记退出复制模式,应用程序会阻塞(我认为一段时间后已经过去了)。
我相信正在发生的事情是屏幕缓冲区被填满并且由于活动复制模式而无法清空。这会导致正在运行的程序挂起,直到重新进入屏幕并退出复制模式。这个错误我已经犯过很多次了。有办法预防吗? (例如,分离时自动退出复制模式,或在复制模式下无法分离)。如果不是,那么 tmux 或其他替代品怎么样?
答案1
放一条线
defnonblock on
在~/.screenrc
还推荐
defflow off
将 Ctrl-Q 和 Ctrl-S 传递给应用程序,而不是阻止屏幕输出。
答案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