Bash 스크립팅-반환 값이 0이 될 때까지 루프


25

스크립트에서 무언가를 마운트 해제해야하지만 때로는 모든 데이터 복사가 끝나기 전에 마운트 해제가 발생하여 마운트 해제가 실패합니다. 나는 "차단"마운트를 수행하는 방법을 찾았지만 아무것도 찾지 못했습니다. 그래서 언 마운트 될 때까지 루프 할 스크립트를 작성하려고했지만 작동하지 않습니다.

while [ `sudo umount mount` ]
do
    sleep 0.1
done
rmdir mount

출력을 실행할 때 :

umount: /home/evantandersen/mount: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
rmdir: failed to remove `mount': Device or resource busy

의 반환 값 sudo umount mount이 0이 될 때까지 반복해서는 안됩니다 .

답변:


59

[명령은 조건식을 평가하는 것입니다. 여기서는 아무 소용이 없습니다.

umount표준 출력에서 ​​아무것도 출력하지 않기 때문에 (오류는 stderr로 이동) `sudo umount mount`아무것도 확장되지 않습니다.

따라서 다음과 같습니다.

while [ ]
do
  sleep 0.1
done

[명령, 옆에 어떤 인수를 전달하지 않을 경우 []반환 거짓 이 루프를 입력하지 않습니다 (0이 아닌 종료 상태), 그래서.

umountstdout에서 오류를 출력 했더라도 해당 출력의 [결과 단어가 유효한 조건식을 구성하지 않았기 때문에 명령을 사용하는 것이 의미가 없었습니다.

여기 당신이 원하는 :

until sudo umount mount
do
  sleep 0.1
done

즉, [명령이 아닌 sudo / umount의 종료 상태를 확인하려고합니다 .

umountstderr에 오류 또는 경고가 출력 되는지 확인하려는 경우 [유용 할 수있는 곳 입니다. 은 -n "some-string"에 의해 인식 조건식입니다 [여부를 테스트 명령 "some-string", 비어 있거나하지 뭔가 같은 :

while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
  sleep 0.1
done

그러나 오류 또는 경고 메시지가 있는지 찾는 것은 일반적으로 나쁜 생각입니다. 이 umount 명령은 종료 코드로 성공했는지 여부를 알려주므로 훨씬 안정적입니다. 성공하고 여전히 경고 메시지를 출력 할 수 있습니다. 실패하고 오류가 발생하지 않을 수 있습니다 (예 : 죽었을 때).

이 특정 경우 umount디렉토리가 마운트되지 않아 실패 할 수 있으며이 경우 영원히 반복되므로 다음과 같은 다른 접근법을 시도 할 수 있습니다.

while mountpoint -q mount && ! sudo umount mount; do
  sleep 0.1
done

또는 "마운트"를 여러 번 마운트하여 모두 마운트 해제하려는 경우 :

while mountpoint -q mount; do
  sudo umount mount || sleep 0.1
done

훌륭 해요!
charliehorse55

1
사용의 차이 설명 +1 [, [[또는 없음. bash 조건에 대한 일반적인 매뉴얼 페이지, GNU 및 / 또는 TLDP 예제가 자세한 내용을 다루고
싶습니다.

5

재사용 가능한 기능이며 'n'초 후에 시간 초과됩니다.

_umount() {
    [[ $# -lt 2 ]] && { 
        echo "Usage: ${FUNCNAME} <timeout_secs> <mnt_point>"; return 1
    }
    timeout=$(($(date +%s) + ${1}))
    until umount "${2}" 2>/dev/null || [[ $(date +%s) -gt $timeout ]]; do
       :
    done
}

잠을 잘 필요가 없습니다


1
[[...]]이다 ksh/ bash/ zsh이 모두 특정, $SECONDS당신이 할 수 있도록, 특별한 변수 :SECONDS=0; until umount... || ((SECONDS > $1)); do..
스테판 Chazelas가

• 그래도 명심 mount remount,roIntenso 마이크로 라인 USB 스틱과 MIPS 장치 ANNO 2009 명령을 수행 할 수있는 23 또는 30 + 초를 완료합니다.
Pro Backup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.