【问题标题】:Bash script doesn't wait until commands have been properly executedBash 脚本不会等到命令被正确执行
【发布时间】:2011-11-05 16:14:43
【问题描述】:

我正在编写一个非常简单的脚本,但由于某些原因,它的某些部分似乎是异步运行的。

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

正如您在调用 sleep 之前看到的那样,脚本只完成了部分工作。如何让我的脚本等到 parted 成功完成其工作?

【问题讨论】:

    标签: linux bash shell udev


    【解决方案1】:

    (由于您问题中的链接,我假设您正在使用 Linux)

    我对@9​​87654322@不是很熟悉,但我相信分区设备节点不是由它直接创建的——它们是由udev创建的,本质上是一个异步过程:

    • parted 创建分区
    • 内核更新其内部状态
    • 内核通知udev daemon (udevd)
    • udevd 检查其规则文件(通常在 /etc/udev/ 下)并创建相应的设备节点

    此过程允许将设备节点处理策略与内核明确分离,这是一件好事 (TM)。不幸的是,它还引入了相对不可预测的延迟。

    处理此问题的一种可能方法是让您的脚本等待设备节点出现:

    while [ ! -e "/dev/sdd1" ]; do sleep 1; done
    

    【讨论】:

      【解决方案2】:

      假设您要做的就是确保在继续之前创建分区,有几种不同的方法

      1. 在进行下一步之前检查已分开的进程是否已完成

      2. 在进行下一步之前检查设备是否准备就绪(您需要检查语法)。例如 直到 [ -f /dev/sdc && -f /dev/sdd ] 睡觉5

      【讨论】:

        猜你喜欢
        • 2013-10-18
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多