October 27, 2019

遭遇 FreeBSD csh/tcsh 的 Bug

我的HomeServer很久以来一直是FreeBSD系统,从9.x一路升级到11.2。

这次又遭遇了csh/tcsh的Bug,上一次是10.x,csh,这一次是11.2,tcsh。

现象

  • login/logout非常慢,一次比一次慢
  • csh/tcsh进程占用大量内存和cpu
  • .histroy文件巨大,而且每次login/logout都成倍增长

上次遭遇,将默认shell从csh换成了tcsh,现象消失,以为问题解决了。然而,这次系统升级到11.2后,现象又出现了.....


网上关于FreeBSD下,此类问题信息很少,倒是RedHat Linux有类似的Iusse公布,原文

大致意思是:

  • .histroy文件数据格式错误,并且文件越来越大
  • 一般情况下,每个命令历史记录都应在.histroy文件中,用时间戳行和输入的命令行进行编排,每行以EOL(End Of Line)结尾
  • 时间戳行和输入的命令行会轮流记录,也就是,时间戳行,命令行,再时间戳行,命令行.....
  • 发出错误时,时间戳行和命令行不轮流记录了,该是命令行的地方错误地记录了时间戳行,而且错误地合并了,没有EOL
  • 导致csh/tcsh使用大量内存来读取.histroy文件,系统被拖慢

这现象和我遭遇的简直一模一样。

RedHat给出的临时解决方法是修改shell变量savehist

修改.cshrc文件
savehist=

或执行命令
set savehist=

原理是防止对.histroy文件执行任何写操作(即使空文件,每次都被截断)。

RedHat提到,主要问题是tcsh不会专门去处理.histroy文件,如果激活shell变量savehist中的"merge"选项,那么历史命令记录会和现有历史命令记录文件合并,而不是覆盖,并以时间戳排序,这将可能导致更多的意外行为发生!

查看我的了.cshrc文件,果不其然!
savehist = (1000 merge)

果断的根据RedHat的方法修改,药到病除^_^

可是RedHat已经修复了这个Bug,FreeBSD呢.....