linux - Bash 脚本不会等到命令被正确执行

标签 linux bash shell udev

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

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)

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

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

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

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

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

关于linux - Bash 脚本不会等到命令被正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021427/

相关文章:

shell - jq 具有来自不同来源的多个输入

linux - 将 ls 命令的输出存储在 shell 变量中

linux - 在脚本中启动 shell

c++ - Apache 模块 - 获取请求正文

c - 在linux lockf、flock和fcntl下用C语言锁定文件是什么意思?

Bash 列表理解或映射

java - 将 sshpass 与 bash 一起使用可以从命令行运行,而不是从 java exec 运行

linux - 无法运行 `make` 命令

java - 从 Linux 上的 java 程序连接到路由器

linux - 在 shell 脚本中用空格替换逗号