2011-11-05 4 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 

수면 호출 전에 알 수 있듯이 스크립트는 일부만 작업을 마쳤습니다. parted가 작업을 성공적으로 완료 할 때까지 스크립트를 기다리게하려면 어떻게해야합니까?

답변

6

(난 당신이 인해 해당 링크를 리눅스에서 작업하는 가정 오전)

나는 parted 매우 익숙하지 않은,하지만 난 파티션 장치 노드가 직접 만들어 그것으로되지 않습니다 생각 - 그들은 자연 비동기 절차 인 udev에 의해 만들어집니다 :

  • parted 파티션을 생성
  • 커널은 커널 통지
  • 내부 상태 갱신 udev 데몬 (udevd)
  • udevd 검사는 룰 파일 (일반적 /etc/udev/ 미만) 및 적절한 디바이스 노드를 생성

이 절차는 Gooding (TM) 인 커널에서 장치 노드 처리 정책을 명확하게 분리 할 수있게합니다. 불행하게도, 예측할 수없는 지연이 발생합니다. 장치 노드가 나타날 때까지

이 처리하는 가능한 방법은 스크립트 대기를하는 것입니다 :

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

는 두개의 서로 다른 접근법을 사용하면 파티션을 진행하기 전에 생성되는 것을 보장 할 일은 원하는 모든있다 가정하고 프로세스는 다음 단계

  • 로 이동하기 전에 완료 헤어 여부를

    1. 확인

      다음 단계로 이동하기 전에 장치가 준비되어 있는지 확인하십시오 (구문을 확인해야합니다). 예 까지 [-f는/dev/SDC & & -f는/dev/SDD] 수면 5

  • 관련 문제