为什么GNU屏幕在设置为复制模式时有时会阻塞内部进程,而有时却不会?
例如,复制模式不会阻止以下 bash 单行代码:
while ((1)) ; do echo $i; i=$((i+1)); sleep 0.1; done
如果运行此命令,则调用复制模式(CTRL+A 转义),等待几秒钟,然后离开该模式(ESCAPE),输出将跳转,因为它继续在复制显示"后面"运行。
但是,如果您使用 C Makefile 并执行相同的操作,您会发现在某些情况下,内部编译会冻结,并且不会在幕后继续。仅当您离开复制模式时,它才会继续。
但并非适用于所有生成文件:
.PSEUDO: count
count:
number=1 ; while (true) ; do
echo $$number ;
number=$$((number + 1)) ;
sleep 0.1 ;
done
谁能对此有所了解?它是否与屏幕内的流量控制有关,或者可能与 obuflimit 有关?我已经尝试了许多这样的设置,但我真的不清楚发生了什么以及如何影响它。显然,屏幕无法永远保存输出,因为这会占用无限的内存,但是缓冲区的大小是多少,有没有办法改变这一点,以便对具有重要输出的make
的调用可以在复制模式后面运行到完成显示?
限制不在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
将继续运行。