Bash 스크립트 - 반환 값이 0이 될 때까지 반복

Bash 스크립트 - 반환 값이 0이 될 때까지 반복

스크립트에서 무언가를 제거해야 하는데 때로는 모든 데이터 복사가 완료되기 전에 제거되어 제거가 실패하는 경우가 있습니다. "차단된" 제거를 수행하는 방법을 찾았지만 아무것도 찾지 못했습니다. 그래서 제거할 수 있을 때까지 반복되는 스크립트를 작성해 보았지만 작동하지 않습니다.

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(성공적으로 제거되었음을 의미)이 될 때까지 반복하면 안 되나요 ?

답변1

[명령은 조건식을 평가합니다. 여기에 넣어도 소용이 없습니다.

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

그처럼:

while [ ]
do
  sleep 0.1
done

[매개변수가 전달되지 않으면 명령 이 [반환됩니다 .]잘못된(0이 아닌 종료 상태) 루프에 들어가지 않도록 합니다.

umount표준 출력에 오류가 인쇄 되더라도 [이 출력에서 ​​생성된 단어는 유효한 조건식을 형성하지 않으므로 이 명령을 사용하는 것은 의미가 없습니다.

원하는 곳은 다음과 같습니다.

until sudo umount mount
do
  sleep 0.1
done

[즉, 명령의 종료 상태 가 아닌 sudo/umount의 종료 상태를 확인하려는 것입니다 .

umount이는 stderr에 오류나 경고가 출력되는지 확인하려는 경우 [유용할 수 있습니다 . 이는 null을 테스트하기 위해 -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

또는 "mount"가 여러 번 마운트될 수 있고 모두 마운트 해제하려는 경우:

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

답변2

재사용 가능한 기능이며 '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
}

잠을 잘 필요가 없어

관련 정보