在Linux中使用CLI only工具生成磁盘使用情况图表/图表

在这个问题中,有人要求在Linux中显示磁盘使用的方法。 我想进一步沿着这条路线走一步…如何从一个合理的答案的输出获取输出的shell脚本,并从中产生一个graphics/图表(输出在PNG文件或东西)? 这可能是一个普通的问题要求太多的代码,但我的猜测是,有人已经有一个oneliner铺设在某处…

我会推荐munin 。 它是专门为这种事情设计的 – 绘制CPU使用率,内存使用情况,光盘使用情况等。 有点像MRTG(但是MRTG主要是为了绘制路由器的流量,绘制什么,但带宽是非常黑客)

编写Munin插件非常简单(这是项目目标之一)。 它们几乎可以写入任何东西(shell脚本,perl / python / ruby​​ / etc,C,任何可以执行并产生输出的东西)。 插件输出格式基本上是disc1usage.value 1234 。 调试插件是非常容易的(与MRTG相比)

我已经在笔记本电脑上设置了它,监视磁盘使用情况,带宽使用情况(通过从我的ISP控制面板提取数据,它绘制了我的两个下载“箱”,上传和新闻组使用情况),平均负载和进程数。 一旦我安装好了(目前在OS X上稍微有些困难,但是在Linux / FreeBSD上,这是微不足道的),我几分钟就写了一个插件,第一次就工作了!

我会描述它是如何设置的,但是这个munin站点会做得比我做得更好!

这里有一个示例安装

一些替代品是nagios和仙人掌。 你也可以使用rrdtool写一些类似的东西。 Munin,MRTG和Cacti基本上都是以这个图形工具为基础的远远好用的系统。

如果你想要的东西真的很简单,你可以做..

 import os import time while True: disc_usage = os.system("df -h / | awk '{print $3}'") log = open("mylog.txt") log.write(disc_usage + "\n") log.close() time.sleep(60*5) 

然后..

 f = open("mylog.txt") lines = f.readlines() # Convert each line to a float number lines = [float(cur_line) for cur_line in lines] # Get the biggest and smallest biggest = max(lines) smallest = min(lines) for cur_line in lines: base = (cur_line - smallest) + 1 # make lowest value 1 normalised = base / (biggest - smallest) # normalise value between 0 and 1 line_length = int(round(normalised * 28)) # make a graph between 0 and 28 characters wide print "#" * line_length 

这将形成一个简单的光盘使用情况的ASCII图。 我真的不建议你使用这样的东西。 为什么? 日志文件将变得越来越大,越来越大。 图形将逐渐变慢。 RRDTool使用滚动数据库系统来存储它的数据,所以文件永远不会超过大约50-100KB,并且由于文件是固定长度,所以一直很快地绘制出来。

简而言之。 如果你想要简单地绘制任何东西,请使用munin 。 如果你想要一些小而独立的东西,用RRDTool写一些东西。

如果一些ASCII字符对你来说足够“图形”,我可以推荐ncdu 。 这是一个非常好的交互式CLI工具,它可以帮助我在不用cd bigdir的情况下下大目录。 一次又一次地重复着。

我们在工作中使用RRDtool (数据存储后端工具,如MRTG)推出了自己的工作。 我们每5分钟运行一次perl脚本,每个分区需要一个du,并将其填充到RRD数据库中,然后使用RRD的图形函数来构建图形。 如何设置.rrd文件需要一些时间(例如,我不得不重新学习RPN来完成一些我想要做的计算),但是如果您有一些数据要随时间变化, RRD工具是一个很好的选择。

我猜这有几个选择:

  1. 对于纯粹的CLI解决方案,使用类似gnuplot的东西。 看这里的例子用法。 自从我的学生时代以来,我没有使用过gnuplot 🙂

  2. 不是纯粹的CLI解决方案,而是下载类似JFreeChart的东西,然后编写一个简单的Java应用程序,读取stdin并创建图表。

希望这可以帮助。