동일한 쉘 스크립트에서 마운트 및 마운트 해제하면 오류가 발생합니다.

동일한 쉘 스크립트에서 마운트 및 마운트 해제하면 오류가 발생합니다.

tar단일 쉘 스크립트에서 볼륨, 마운트된 볼륨의 내용을 마운트하고 마운트된 볼륨을 마운트 해제 해야 합니다 .

그래서 다음과 같이 코딩했습니다.

$ cat sample.sh
sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar-cvf /tmp/sample.tar *
sudo umount /tmp/mnt

오류가 발생했습니다.umount: /tmp/mnt: device is busy.

그래서 확인해 봤어

$ lsof /tmp/mnt

현재 "sh" 파일을 출력합니다. 그래서 나는 /tmp/mnt현재 스크립트가 사용 중이라고 스스로 확신했습니다(이 경우에는 Sample.sh).

동일한 스크립트에 메소드(install, tar, uninstall)가 있습니까?

폴리스티렌: 스크립트가 완료된 후 /tmp/mnt 볼륨을 마운트 해제할 수 있습니다.

답변1

제거하려면 다음과 같이 디렉터리를 종료해야 합니다.

#!/bin/bash
sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
#Got to the old working directory. **NOTE**: OLDPWD is set automatically.
cd $OLDPWD
#Now we're able to unmount it. 
sudo umount /tmp/mnt

이제는 맞습니다.

답변2

cd방금 이동했기 때문에 장치는 "사용 중" 상태입니다 . 현재 작업 디렉터리(모든 프로세스의 파티션, 이 경우 셸)는 마운트 해제할 수 없습니다.

귀하의 스크립트:

sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
sudo umount /tmp/mnt

수정된 스크립트에는 동일한 문제가 없습니다.

sudo mount -o loop Sample.iso /tmp/mnt
( cd /tmp/mnt && tar -cvf /tmp/sample.tar * )
sudo umount /tmp/mnt

서브쉘에서 발생하기 때문에 cd외부 환경에는 영향을 미치지 않으며, 발생 시 현재 디렉터리는 umount스크립트가 실행된 위치가 됩니다.

이는 다음을 수행하는 매우 일반적인 쉘 구성입니다.

( cd dir && somecommand )

이는 어딘가로 갔다가 다시 돌아오는 것보다 훨씬 더 명확하고 명확합니다 cd. 특히 스크립트 중에 여러 디렉토리로 이동해야 하는 경우 더욱 그렇습니다.

이는 또한 어떤 이유로 실패하면 &&명령이 실행되지 않음을 의미합니다. 예를 들어 cd, 스크립트에서 실패하면 여전히 빈(?) 디렉토리의 아카이브를 mount생성하게 되는데 이는 아마도 원하는 것이 아닐 것입니다.tar

-C다음 플래그의 더 짧은 변형을 사용하십시오 tar.

sudo mount -o loop Sample.iso /tmp/mnt
tar -cvf /tmp/sample.tar -C /tmp/mnt .
sudo umount /tmp/mnt

이것은 만든다tarcd현재 디렉터리( /tmp/mnt)를 아카이브에 추가하기 전에 내부 작업을 수행합니다. 그러나 이렇게 하면 숨겨진 파일이나 폴더도 아카이브에 추가됩니다.

관련 정보