为什么GNU屏幕在设置为复制模式时,有时会阻止内部进程,有时却不会阻止内部进程?
例如,以下bash one-liner未被复制模式阻止:
while ((1)) ; do echo $i; i=$((i+1)); sleep 0.1; done
如果你运行它,然后调用复制模式(CTRL + A ESCAPE),等待几秒钟,然后离开模式(ESCAPE),输出将跳转,因为它继续在复制显示“后面”运行。
但是如果你拿一个C Makefile并且做同样的事情,你会看到在某些情况下冻结中的编译,并且不会在幕后继续。只有当您离开复印模式时才会继续。
然而并非适用于所有Makefile:
.PSEUDO: count
count:
number=1 ; while (true) ; do \
echo $$number ; \
number=$$((number + 1)) ; \
sleep 0.1 ; \
done
有人可以对此有所了解吗?它与屏幕内的流量控制有关,还是与obuflimit有关?我已经玩了很多这些设置,但我真的不清楚发生了什么以及如何影响它。显然,屏幕无法永远保存输出,因为这将占用无限的内存,但缓冲区的大小是多少,有没有办法改变这一点,以便具有重要输出的make
的调用可以在后面运行完成复印模式显示?
答案 0 :(得分:1)
限制不在screen
。每个tty / pty都有一个输入缓冲区和输出缓冲区。当输入(或输出)缓冲区已满时,将阻止从(或写入)读取的进程或某些数据将丢失。
不确定是否可以更改缓冲区大小,但您可以通过这种方式进行操作:
touch make.log
tail -f make.log &
make >> make.log 2>&1
# when `make' is done, kill the `tail', e.g. with bash:
kill %%
然后当您进入屏幕的复制模式时,它只能阻止tail
进程,make
将继续运行。