如何控制 GNU 屏幕的阻塞行为
How to control GNU screen's blocking behaviour
为什么 GNU 屏幕在设置为复制模式时有时会阻止内部进程,而其他时候却不会?
例如,下面的bash一行不被复制模式屏蔽:
while ((1)) ; do echo $i; i=$((i+1)); sleep 0.1; done
如果你运行这个,然后调用复制模式(CTRL+A ESCAPE),等待几秒钟,然后离开模式(ESCAPE),输出会跳转,因为它继续到运行 "behind"复制显示。
但是如果您使用 C Makefile 并执行相同的操作,您会发现在某些情况下,其中的编译会冻结,并且不会在幕后继续进行。只有当您离开复制模式时它才会继续。
但不是所有的 Makefiles:
.PSEUDO: count
count:
number=1 ; while (true) ; do \
echo $$number ; \
number=$$((number + 1)) ; \
sleep 0.1 ; \
done
任何人都可以阐明这一点吗?它与屏幕内的流量控制有关,还是与 obuflimit 有关?我玩过很多这样的设置,但我真的不清楚发生了什么以及如何影响它。显然 screen 不能永远保存输出,因为那样会占用无限的内存,但是缓冲区的大小是多少,有什么方法可以改变它,以便调用 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
将保持 运行。
为什么 GNU 屏幕在设置为复制模式时有时会阻止内部进程,而其他时候却不会?
例如,下面的bash一行不被复制模式屏蔽:
while ((1)) ; do echo $i; i=$((i+1)); sleep 0.1; done
如果你运行这个,然后调用复制模式(CTRL+A ESCAPE),等待几秒钟,然后离开模式(ESCAPE),输出会跳转,因为它继续到运行 "behind"复制显示。
但是如果您使用 C Makefile 并执行相同的操作,您会发现在某些情况下,其中的编译会冻结,并且不会在幕后继续进行。只有当您离开复制模式时它才会继续。
但不是所有的 Makefiles:
.PSEUDO: count
count:
number=1 ; while (true) ; do \
echo $$number ; \
number=$$((number + 1)) ; \
sleep 0.1 ; \
done
任何人都可以阐明这一点吗?它与屏幕内的流量控制有关,还是与 obuflimit 有关?我玩过很多这样的设置,但我真的不清楚发生了什么以及如何影响它。显然 screen 不能永远保存输出,因为那样会占用无限的内存,但是缓冲区的大小是多少,有什么方法可以改变它,以便调用 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
将保持 运行。