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