在这个问题中 有人询问如何在 Linux 中显示磁盘使用情况。我想在 cli 路径上更进一步......一个 shell 脚本如何从前一个问题的合理答案中获取输出并从中生成图形/图表(输出为 png 文件或其他文件)?在常规问题中,这可能有点太多的代码,但我的猜测是,有人已经在某处放置了一个 oneliner...

有帮助吗?

解决方案

我会推荐 穆宁. 。它正是为此类事情而设计的 - 绘制 CPU 使用情况、内存使用情况、磁盘使用情况等图表。有点像 MRTG(但 MRTG 主要旨在绘制路由器的流量图,用它绘制除带宽以外的任何内容都是非常黑客的)

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

我已经在我的笔记本电脑上设置了它来监控光盘使用情况、带宽使用情况(通过从 ISP 的控制面板提取数据,它以图表形式显示我的两个下载“垃圾箱”、上传和新闻组使用情况)、平均负载和进程数。一旦我安装了它(目前在 OS X 上有点困难,但在 Linux/FreeBSD 上很简单),我在几分钟内编写了一个插件,并且它第一次工作了!

我会描述它的设置方式,但 munin 网站会比我做得更好!

有一个安装示例 这里

一些替代品是 nagios 和 cacti。您也可以使用 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,并且由于文件长度固定,因此绘制图表的速度始终很快。

简而言之。如果您想要轻松绘制几乎所有内容的图表,请使用 穆宁. 。如果您想要更小且独立的东西,请使用 RRDTool 编写一些东西。

其他提示

如果某些 ASCII 字符对您来说足够“图形化”,我可以推荐 NCDU. 。这是一个非常好的交互式 CLI 工具,它可以帮助我在不执行 cd bigdir 的情况下逐步进入大型目录;du -hs 一遍又一遍。

我们在工作中使用了自己的 RRD工具 (MRTG 等工具的数据存储后端)。我们每 5 分钟运行一个 perl 脚本,该脚本获取每个分区的 du 并将其填充到 RRD 数据库中,然后使用 RRD 的图形函数来构建图形。弄清楚如何设置 .rrd 文件需要花一些时间(例如,我必须重新学习 RPN 才能完成一些我想做的计算),但如果您有一些数据想要随着时间的推移绘制图表, RRD 工具是一个不错的选择。

我想有几个选择:

  1. 对于纯 CLI 解决方案,请使用 gnuplot 之类的东西。看 这里 例如用法。从学生时代起我就没有使用过 gnuplot :-)

  2. 并不是真正的纯粹的 CLI 解决方案,但下载类似的东西 自由图表 并编写一个简单的 Java 应用程序来读取 stdin 并创建图表。

希望这可以帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top