如何最方便地从 bash 脚本获取磁盘统计信息?
我已经在使用了
cat /sys/block/*/stat
按磁盘/分区计算总体带宽,但是我还尝试确定磁盘的总体大小以及已使用/可用的扇区数。
我知道这些统计数据可以使用df
,但是我正在寻找替代方案(如何df它的后端工作吗? ),最好使用/sys/class/
或/sys/block/
。
这可能吗?或者我需要使用df | awk
top 获取我正在寻找的统计数据?
编辑
用例:
这用于指标报告脚本,该脚本将从系统收集各种信息并将其报告给图形系统。
即抓取扇区读/写统计信息
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
我想做类似的事情,但获取扇区总数,与已使用/空闲的扇区数。
答案1
对于您想要做的事情来说,最便携的工具是df
.不要乱搞,/sys
它不能保证在任何非 Linux 系统上。并且不要重新发明轮子。这正是它的df
目的和原因指定的通过 POSIX。
当然,事情并没有那么简单,有多种df
实现,其中一些具有不同的格式。然而,编写 POSIX 规范的好人以他们无限的智慧,在规范中包含了以下选项df
:
-P
Produce output in the format described in the STDOUT section.
因此,如果您总是使用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 字节为单位。当该数字小于或等于零时,除非该进程具有适当的权限,否则在不首先删除其他文件的情况下,不可能在文件系统上创建任何新文件。所写的数字可能小于零。当前分配给文件系统上所有文件的正常可用空间的百分比。这应使用分数计算:/( + )
以百分比表示。如果小于零,则该百分比可能大于 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}')