dstat程序显示表头,然后每隔一定时间逐行显示一次实际值:
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 1 98 0 0 1| 0 0 |7884B 1058B| 0 0 | 334 266
0 1 99 0 0 0| 0 0 |8565B 1660B| 0 0 | 324 276
0 1 99 0 0 0| 0 0 |6996B 590B| 0 0 | 325 240
0 0 99 0 0 1| 0 0 |6718B 992B| 0 0 | 348 236
1 1 98 0 0 0| 0 0 |7116B 964B| 0 0 | 408 276
0 1 99 0 0 0| 0 0 |6500B 468B| 0 0 | 343 221
0 0 99 0 0 1| 0 0 |6136B 830B| 0 0 | 318 217
有趣的是,当表头上升时,在控制台窗口外,立即出现一个新表头。看起来好像 dstat 知道窗口的高度,并在适当的时候再次发送带有标题的两行。
我尝试在运行 dstat 后更改高度。程序会在适当的时候重新调整并发送标题。
这是怎么发生的?有些代码是在客户端执行的?控制台是否通过某种协议提供窗口大小?
如果我们谈论这个用python编写的特定程序,那么在它开始执行时,它会在 initterm() 函数中“喂养土壤” :
现在关于“一般”。
例如,在交互式 shell 会话中(在bash和zsh中测试)您可以访问环境变量
COLUMNS和LINES(它们由 shell 设置并在调整终端大小时动态更改):在程序/脚本中,除了上面提到的低级工具外,您还可以使用stty或tput程序。顺便说一句,当调整终端大小时,终端仿真器通常会向其中运行的进程发送一个SIGWINCH信号。这通常是一个 shell 进程,它又将信号转发给正在运行的子进程。
一个说明性的脚本示例(理论上应该在任何与 posix 兼容的 shell 中工作):
启动后,您可以看到在调整终端仿真器窗口大小时,
sleep首先(在对外部程序的下一次调用完成后 - )处理WINCH信号,然后才显示当前值: