在命令行上检索磁盘统计信息

Mat*_*ark 3 disk-usage block-device

我怎样才能最便携地从 bash 脚本中获取磁盘统计信息?

我已经在使用

cat /sys/block/*/stat
Run Code Online (Sandbox Code Playgroud)

按磁盘/分区计算总体带宽,但是我还试图确定磁盘的总体大小以及已使用/可用的扇区数。

我知道这些统计数据都可以使用df,但是我正在寻找一个替代(如何做DF做它的后台工作?),最好的东西,用途/sys/class//sys/block/

这可能吗?或者我是否需要使用df | awktop 来获取我正在寻找的统计数据?

编辑

用例:

这用于指标报告脚本,该脚本将从系统收集各种信息并将其报告给图形系统。

即抓取扇区读/写统计信息

for device in /sys/block/*
do

    stats=$( cat $device/stat )

    sectorsRead=$( echo $stats | awk '{print $3}' )
    sectorsWrite=$( echo $stats | awk '{print $7}' )

    doSomethingWith sectorsRead
    doSomethingWith sectorsWrite
done
Run Code Online (Sandbox Code Playgroud)

我正在做类似的事情,但要获取扇区总数,而不是已使用/空闲的扇区。

ter*_*don 6

您正在尝试做的最便携的工具是df. 不要摆弄/sys不能保证在任何非 Linux 系统上。并且不要重新发明轮子。这正是POSIX指定df它的目的和原因。

当然,事情并没有那么简单,有各种df实现,其中一些具有不同的格式。然而,编写 POSIX 规范的好人以其无限的智慧在规范中包含了以下选项df

 -P
    Produce output in the format described in the STDOUT section.
Run Code Online (Sandbox Code Playgroud)

所以,如果你总是使用df -P它,它应该尽可能的便携。使用该标志时,任何符合 POSIX 的df版本(应该是所有版本或尽可能接近没有区别)将按照以下规范生成输出(取自POSIXdf页面):

当 -k 和 -P 选项都被指定时,应写入以下标题行(在 POSIX 语言环境中):

"文件系统 1024 个块已使用可用容量安装在\n"

当指定 -P 选项而没有 -k 选项时,应写入以下标题行(在 POSIX 语言环境中):

"文件系统 512 块使用的可用容量安装在\n"

实现方式可以调整标题行和各个数据行的间距,使信息按列有序呈现。

带有 -P 的剩余输出应包含每个指定文件系统的一行信息。这些行的格式如下:

"%s %d %d %d %d%% %s\n", , , , , ,

在下面的列表中,所有以 512 字节单位(指定 -k 时为 1024 字节)表示的数量应向上取整到下一个更高的单位。这些字段是:

文件系统的名称,采用实现定义的格式。以 512 字节为单位的文件系统总大小。此图的确切含义是实现定义的,但应包括 、 以及系统保留的任何用户通常不可用的空间。分配给文件系统中现有文件的空间总量,以 512 字节为单位。文件系统中可供非特权用户创建新文件的可用空间总量,以 512 字节为单位。当该数字小于或等于 0 时,除非进程具有适当的权限,否则在不先删除其他文件的情况下,将不可能在文件系统上创建任何新文件。所写的数字可能小于零。当前分配给文件系统上所有文件的正常可用空间的百分比。这应使用以下分数计算: /( + )

以百分比表示。如果小于零,则该百分比可能大于 100。百分比值应表示为正整数,任何小数结果都会使其四舍五入到下一个最高整数。

显示文件系统层次结构的目录。

您可能还应该使用该-k标志始终将结果打印为 1024 字节单位而不是 512 字节。您也可以进行设置LC_ALL=POSIX以确保语言环境不会影响输出。将所有这些放在一起给出:

结合超便携awk,您可以执行以下操作:

totalSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $2}')
usedSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $3}')
availableSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $4}')
Run Code Online (Sandbox Code Playgroud)