Bash-скрипт не ждет, пока команды будут выполнены правильно - PullRequest
2 голосов
/ 05 ноября 2011

Я работаю над очень простым сценарием, но по некоторым причинам его части, кажется, работают асинхронно.

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 успешно выполнит свою работу?

Ответы [ 2 ]

6 голосов
/ 05 ноября 2011

(я предполагаю, что вы работаете в Linux из-за ссылок в вашем вопросе)

Я не очень знаком с parted, но я считаю, что узлы устройства раздела не создаются непосредственноэто - они создаются udev, который по своей природе является асинхронной процедурой:

  • parted создает раздел
  • ядро ​​обновляет свой внутреннийstate
  • ядро ​​уведомляет демон udev (udevd)
  • udevd, проверяет его файлы правил (обычно в /etc/udev/) и создает соответствующие узлы устройства

Эта процедура позволяет четко отделить политику обработки узлов устройства от ядра, что является хорошей вещью (TM).К сожалению, это также приводит к относительно непредсказуемым задержкам.

Возможный способ справиться с этим - заставить ваш скрипт ждать появления узлов устройства:

while [ ! -e "/dev/sdd1" ]; do sleep 1; done
2 голосов
/ 05 ноября 2011

Если все, что вы хотите сделать, это убедиться, что разделы созданы до продолжения, есть несколько разных подходов

  1. Проверьте, завершился ли процесс parted, прежде чем переходить к следующему шагу

  2. Проверьте, готовы ли устройства, прежде чем переходить к следующему шагу (вам необходимо проверить синтаксис).Например, пока [-f / dev / sdc && -f / dev / sdd] не заснет 5

...