有时在服务器上,如果磁盘IO负载很重,终端会因为tab补全而卡住。Ctrl-C|D|Z
都不要放弃。
每次我必须从另一个会话登录时,找到卡住的 pty 并将其杀死。
有什么办法可以防止选项卡完成挂起吗?
答案1
第一个想法- 当磁盘负载较高时禁用文件名补全。它仅影响文件名,其他完成仍然有效。因为,我认为它们不会导致挂起。
在主目录中创建文件.bash_completion
并将此代码放入其中。
#!/bin/bash
### We are needed redefine original _filedir function
### and add new functionality to it
#
# for this, output the original function code and add the word 'original'
# in the beginning of it - now we are have _filedir renamed to
# 'original_filedir'
eval "original$(declare -f _filedir)"
# Define our own _filedir function, which will check disk load
# and:
# if load are low - call original function.
# if load are high - stop further execution.
_filedir() {
io_load_limit=10
io_load=$(awk '/sda /{print $12}' /proc/diskstats)
if ((io_load > io_load_limit)); then
echo -n "completion disabled - a lot i/o"
return
fi
original_filedir
}
同样的技巧也可以用函数来完成_completion-loader
。它设置动态完成加载。
在Ubuntu中,主要的完成代码驻留在该/usr/share/bash-completion/bash_completion
文件中,而针对特定程序定制的其他代码则驻留在/usr/share/bash-completion/completions/
目录中。
启动时bash
,它会读取/usr/share/bash-completion/bash_completion
文件,然后,apt-get
例如,如果您键入 ,_completion-loader
则运行并apt-get
从/usr/share/bash-completion/completions/apt-get
.它还会影响 I/O,并可能导致挂起。
我决定使用/proc/diskstats用于评估磁盘活动。您可以使用另一种方式。极限值是随机选择的。
第二个想法- 设置 I/O 使用限制,例如这。