![bash 脚本在 RAID 重建完成后执行命令](https://linux22.com/image/127297/bash%20%E8%84%9A%E6%9C%AC%E5%9C%A8%20RAID%20%E9%87%8D%E5%BB%BA%E5%AE%8C%E6%88%90%E5%90%8E%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
有人有脚本来检查 RAID 重建何时完成然后执行命令吗?
我正在检查状态/proc/mdadm
,当resync
完成时,它应该执行一个命令来通知用户告诉我它已经完成。
我不确定 RAID 重建完成后最好检查哪个循环,而且我在互联网上没有找到这样的脚本。
答案1
的相关部分/proc/mdstat
如下所示,其中U
表示“向上”的设备和_
“向下”的设备。当它恢复时,设备显示为“关闭”,因此我们可以等到所有设备再次“启动”。
md0 : active raid5 sda1[0] sdd1[2] sdb1[1]
1465151808 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]
所以,像这样:
dev=md0
until grep -A1 "^$dev :" /proc/mdstat | grep -q '\[UU*\]' ; do
sleep 2
done
run some command here...
(第一个grep
查找给定的设备名称,并打印匹配行并在后面加一个。第二个查找括号之间的 sgrep -A1
字符串。)U
当然,这从不首先检查恢复是否正在运行,我们需要更智能的逻辑来解释完整的输出,因为输出行的数量各不相同。
答案2
我在 ubuntu 18.04LTS 中执行此操作,所以也许grep
有所不同,但A1
给了你一行,所以你的检查不起作用。我将其更改为 grep -A2
,现在至少可以返回您正在谈论的内容:
dev=md0
foo=$(grep -A2 "^$dev :" /proc/mdstat);echo $foo
输出示例:
md0 : active raid5 sdh1[0] sdg1[1] sdf1[2] sde1[4] 8790399744 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] bitmap: 0/22 pages [0KB], 65536KB chunk
所以,我认为应该这样写:
dev=md0
until grep -A2 "^$dev :" /proc/mdstat | grep -q '\[UU*\]' ; do
sleep 2
done
Whatever you want to do goes here.
干杯!