![동일한 쉘 스크립트에서 마운트 및 마운트 해제하면 오류가 발생합니다.](https://linux55.com/image/103604/%EB%8F%99%EC%9D%BC%ED%95%9C%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%A7%88%EC%9A%B4%ED%8A%B8%20%EB%B0%8F%20%EB%A7%88%EC%9A%B4%ED%8A%B8%20%ED%95%B4%EC%A0%9C%ED%95%98%EB%A9%B4%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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
이것은 만든다tar
cd
현재 디렉터리( /tmp/mnt
)를 아카이브에 추가하기 전에 내부 작업을 수행합니다. 그러나 이렇게 하면 숨겨진 파일이나 폴더도 아카이브에 추가됩니다.