使用腳本卸載磁碟映像時出現問題...但不是手動卸載!

使用腳本卸載磁碟映像時出現問題...但不是手動卸載!

這是我第一次寫 shell 腳本,並且發生了一些奇怪的事情。我正在開發嵌入式系統,我希望將腳本 test5.sh 放置在來賓系統的 /root 資料夾中,以安裝 eMMC 卡映像的第一個分區,對其執行測試,刪除 test1 創建的文件,殺死仍在存取卡片的進程[以避免資源繁忙,在我的情況下,fuser命令總是只有一個進程],最後我想卸載卡片本身。這是我寫的:

#!/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 / 命令沒有執行是因為我殺死了進程;手動運轉時:

lsof /mnt

要獲得詳細輸出而不是 fusionr -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

相關內容