2011-11-05 157 views
2

我正在處理一個非常簡單的腳本,但由於某些原因它的一部分似乎異步運行。Bash腳本不會等待,直到命令正確執行

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 

正如您在睡眠之前所看到的,腳本只是部分完成了工作。如何讓我的腳本等到分手完成其工作後才能成功?

回答

6

(我假設你在Linux上工作,由於在你的問題中的鏈接)

我不是很熟悉parted,但我相信,該分區的設備節點不直接創造的 - 它們是由udev創建,它本質上是一個異步過程:

  • parted創建一個分區
  • 內核更新其內部狀態
  • 內核通知udev守護進程(udevd
  • udevd檢查其規則文件(通常在/etc/udev/)並創建相應的設備節點

此過程允許將設備節點處理策略與內核清晰分離,該內核是Good Thing(TM)。不幸的是,它也引入了相對不可預知的延遲。

一種可能的方法來處理這個是讓你的腳本等待設備節點出現:

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

假設所有你想要做的就是確保分區程序之前創建的,有幾個不同的方法

  1. 檢查是否處理分手已經移動到下一個步驟

  2. 前完成

    在轉到下一步之前檢查設備是否準備就緒(您需要檢查語法)。例如 直到[-f的/ dev/SDC & & -f的/ dev/SDD] 睡眠5