Bash hdparm检查3到16个驱动器

Bash hdparm检查3到16个驱动器,bash,Bash,我正在使用命令恢复读取的MB/s hdparm -t /dev/sda | awk '/seconds/{print $11}' 从我阅读的内容来看,测试三次是个好主意。将这些值相加,然后除以3得到平均值 有时我会有3到16个驱动器,所以我想提出一个问题,询问我安装了多少个驱动器。然后在每个驱动器上执行hdparm。。。我想知道是否有一种简单的方法可以将SDA一直更改为SDB、SDC、SDD等,而无需多次键入该命令 谢谢Bash使枚举所有驱动器变得非常容易: $ echo /dev/sd{a.

我正在使用命令恢复读取的MB/s

hdparm -t /dev/sda | awk '/seconds/{print $11}'
从我阅读的内容来看,测试三次是个好主意。将这些值相加,然后除以3得到平均值

有时我会有3到16个驱动器,所以我想提出一个问题,询问我安装了多少个驱动器。然后在每个驱动器上执行hdparm。。。我想知道是否有一种简单的方法可以将SDA一直更改为SDB、SDC、SDD等,而无需多次键入该命令


谢谢

Bash使枚举所有驱动器变得非常容易:

$ echo /dev/sd{a..h}
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh
for drive in /dev/sd{a..h}; do
    printf '%s: %s\n' "$drive" "$(perform_timing "$drive")"
done
然后你说你想平均计时输出,那么让我们定义一个函数来实现这一点:

perform_timing() {
    for i in {1..3}; do hdparm -t "$1"; done |
        awk '/seconds/ { total += $11; count++ } END { print (total / count) }'
}
然后您可以在所有驱动器上运行它:

$ echo /dev/sd{a..h}
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh
for drive in /dev/sd{a..h}; do
    printf '%s: %s\n' "$drive" "$(perform_timing "$drive")"
done
把它烧掉
perform\u timing
函数做两件事:1)运行
hdparm
三次,然后2)平均输出。您可以通过手动运行第一部分来了解其工作原理:

# for i in {1..3}; do hdparm -t "/dev/sdc"; done

/dev/sdc:
 Timing buffered disk reads: 1536 MB in  3.00 seconds = 511.55 MB/sec

/dev/sdc:
 Timing buffered disk reads: 1536 MB in  3.00 seconds = 511.97 MB/sec

/dev/sdc:
 Timing buffered disk reads: 1538 MB in  3.00 seconds = 512.24 MB/sec
第二部分将
awk
代码与逻辑相结合,以平均所有行,而不是单独打印它们。您可以通过一个简单的
awk
示例了解平均值的工作原理:

$ printf '1\n4\n5\n'
1
4
5
$ printf '1\n4\n5\n' | awk '{ total += $1; count++ } END { print (total / count) }'
3.33333
我们将所有这些逻辑封装在一个名为
perform\u timing
的函数中,作为一种良好的编程实践。这让我们可以像调用任何其他命令一样调用它:

# perform_timing /dev/sdc
512.303
最后,不要写:

perform_timing /dev/sda
perform_timing /dev/sdb
...
我们将其全部封装在一个循环中,这个简化的循环应该有助于解释:

# for drive in /dev/sd{a..c}; do printf '%s\n' "$drive"; done
/dev/sda
/dev/sdb
/dev/sdc

只需使用,无需任何循环:

#hdparm -i /dev/sd{a..d}

旁注:
grep
在这里不是必需的,只是:
hdparm-t/dev/sda | awk'/seconds/{print$11}'
谢谢你,我将更改代码。只是想找一个比写48行更好的写作方式…谢谢你,这似乎很有效。你能把密码分解一下,告诉我发生了什么事吗?对编程还是新手,等等。我只是想了解一下这里的情况。@user3533305我试着把它分解一下。如果你有任何更具体的问题,请告诉我。太棒了,谢谢你帮助我,并且更好地理解了代码。这意味着很多!好了,还有一个问题,“$1”是如何获取/dev/sda、/dev/sdb等的?@user3533305
$1
是第一个函数参数,它从传递的任何内容获取值,如
执行计时第一个参数第二个参数。也许需要更多信息。