3

私は非常に単純なスクリプトに取り組んでいますが、何らかの理由でその一部が非同期で実行されているようです。

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が正常に機能するまでスクリプトを待機させるにはどうすればよいですか?

4

2 に答える 2

6

(質問のリンクにより、Linuxで作業していると思います)

にはあまり詳しくありませんpartedが、パーティション デバイス ノードは によって直接作成されるudevのではなく、本質的に非同期の手順である によって作成されると思います。

  • partedパーティションを作成します
  • カーネルは内部状態を更新します
  • udevカーネルはデーモンに通知します ( udevd)
  • udevdルール ファイル (通常は の下/etc/udev/) をチェックし、適切なデバイス ノードを作成します。

この手順により、デバイス ノード処理ポリシーをカーネルから明確に分離できます。これは Good Thing (TM) です。残念ながら、比較的予測不可能な遅延も発生します。

これを処理する可能な方法は、デバイス ノードが表示されるまでスクリプトを待機させることです。

while [ ! -e "/dev/sdd1" ]; do sleep 1; done
于 2011-11-05T17:48:32.370 に答える
2

先に進む前にパーティションが作成されていることを確認するだけだと仮定すると、いくつかの異なるアプローチがあります

  1. 次のステップに進む前に、プロセス parted が完了したかどうかを確認します

  2. 次のステップに進む前に、デバイスの準備が整っているかどうかを確認してください (構文を確認する必要があります)。例 [ -f /dev/sdc && -f /dev/sdd ] スリープ 5 まで

于 2011-11-05T17:41:18.143 に答える