我正在编写一个非常简单的脚本,但出于某种原因,它的某些部分似乎是异步运行。
singlePartDevice() {
# http://www.linuxquestions.org/questions/linux-software-2/removing-all-partition-from-disk-690256/
# http://serverfault.com/questions/257356/mdadm-on-ubuntu-10-04-raid5-of-4-disks-one-disk-missing-after-reboot
# Create single partition
parted -s "$1" mklabel msdos
# Find size of disk
v_disk=$(parted -s "$1" print|awk '/^Disk/ {print $3}'|sed 's/[Mm][Bb]//')
parted -s "$1" mkpart primary ext3 4096 ${v_disk}
parted -s "$1" set 1 raid on
return 0
}
singlePartDevice "/dev/sdc"
singlePartDevice "/dev/sdd"
#/dev/sdc1 exists but /dev/sdd1 does not exist
sleep 5s
#/dev/sdc1 exists AND /dev/sdd1 does also exist
正如您在睡眠调用之前看到的那样,脚本只完成了部分工作。如何使我的脚本等到parted完成其工作成功?
答案 0 :(得分:6)
(由于你问题中的链接,我假设你正在使用Linux)
我对parted
不是很熟悉,但我认为分区设备节点不是由它直接创建的 - 它们是由udev
创建的,它本质上是一个异步过程:
parted
创建分区udev
守护程序(udevd
)udevd
检查其规则文件(通常位于/etc/udev/
下)并创建相应的设备节点此过程允许将设备节点处理策略与内核(Good Thing(TM))明确分离。不幸的是,它也引入了相对不可预测的延迟。
处理此问题的一种可能方法是让您的脚本等待设备节点出现:
while [ ! -e "/dev/sdd1" ]; do sleep 1; done
答案 1 :(得分:2)
假设你要做的就是确保在继续之前创建分区,有几种不同的方法
在进入下一步之前,检查已完成的过程是否已完成
在进入下一步之前检查设备是否准备就绪(您需要检查语法)。例如 直到[-f / dev / sdc&& -f / dev / sdd] 睡5