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이 될 때까지 반복해서는 안됩니다 .



답변

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

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


답변

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

잠을 잘 필요가 없습니다


답변