스크립트를 사용하여 디스크 이미지를 마운트 해제하는 중 문제가 발생했습니다. 하지만 수동으로는 불가능합니다!

스크립트를 사용하여 디스크 이미지를 마운트 해제하는 중 문제가 발생했습니다. 하지만 수동으로는 불가능합니다!

쉘 스크립트를 작성하는 것은 처음인데 뭔가 이상한 일이 일어나고 있습니다. 저는 임베디드 시스템에서 작업 중이고 eMMC 카드 이미지의 첫 번째 파티션을 마운트하고 테스트를 수행하고 test1에서 생성된 파일을 제거하기 위해 게스트 시스템의 /root 폴더에 스크립트 test5.sh를 배치하고 싶었습니다. 여전히 카드에 액세스하고 있는 프로세스를 종료하고[리소스 사용량이 많은 것을 피하기 위해 내 경우에는 퓨저 명령에서 항상 하나의 프로세스만 있음] 마지막으로 카드 자체를 마운트 해제하고 싶습니다. 이것이 내가 쓴 것입니다:

#!/bin/sh

cd ../dev
e2fsck mmcblk0p1
mount -t auto mmcblk0p1 ../mnt
cd ../mnt
./../bin/test1
rm file*
variable=$(fuser -m /mnt)
echo $variable
kill -9 $variable
echo "Before the problem"
umount /mnt
echo "After the problem"

문제는 터미널 출력에서 ​​확인할 수 있듯이 마지막 umount 명령이 실행되지 않는다는 것입니다.

# ./test5.sh 
e2fsck 1.42.12 (29-Aug-2014)
mmcblk0p1: clean, 11/117360 files, 7386/468990 blocks
STARTED
random: nonblocking pool is initialized
ENDED
647
Killed
# mount
[...]
mmcblk0p1 on /mnt type ext2 (rw,relatime,errors=continue)

이 시점에서 스크립트의 마지막 명령을 수동으로 보내는 경우:

umount /mnt

작업이 성공적으로 완료되었습니다. [마운트를 확인했습니다.] 스크립트의 마지막 줄이 "보이지 않는" 이유는 무엇입니까? 누락된 점을 찾을 수 없습니다. 이 문제를 해결하는 방법은 무엇입니까?

도움을 주실 분들께 미리 감사드립니다.


편집하다


내가 죽인 프로세스 때문에 umount /command가 실행되지 않는다고 생각하기 시작했습니다. 수동으로 실행할 때:

lsof /mnt

Fuser -m /mnt [640만 반환] 대신 자세한 출력을 얻으려면 출력은 다음과 같습니다.

# lsof /mnt
1   /bin/busybox    /dev/console
1   /bin/busybox    /dev/console
1   /bin/busybox    /dev/console
624 /bin/busybox    /dev/null
624 /bin/busybox    /dev/null
624 /bin/busybox    /dev/null
624 /bin/busybox    socket:[747]
624 /bin/busybox    /tmp/messages
625 /bin/busybox    /dev/null
625 /bin/busybox    /dev/null
625 /bin/busybox    /dev/null
625 /bin/busybox    socket:[751]
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/tty

내가 보기에 pid 640[사용 중인 리소스를 제공하는 프로세스, ttyAMA0은 내 임베디드 시스템의 직렬 포트]으로 프로세스를 종료하면 스크립트의 나머지 부분이 종료된다는 의미인 것 같습니다. [마지막 두 개의 에코 라인도 건너뜁니다. ]. 그리고 수동으로 킬 라인을 실행하면 다시 로그인해야 하지만 스크립트를 시작할 때는 이런 일이 발생하지 않습니다. 이제 원인과 해결 방법을 알면 좋을 것 같습니다.

답변1

cd ../mnt현재 작업 디렉토리가 장치가 마운트된 위치와 동일하다는 것을 의미하는 스크립트가 포함되어 있기 때문에 스크립트는 스크립트 중에 장치를 마운트 해제하지 않으므로 스크립트를 다음과 같이 변경합니다.

#!/bin/sh

cd ../dev
e2fsck mmcblk0p1
mount -t auto mmcblk0p1 ../mnt
cd ../mnt
./../bin/test1
rm file*
variable=$(fuser -m /mnt)
echo $variable
kill -9 $variable
cd ~
sudo umount -f /mnt

관련 정보