这是我第一次编写 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
操作成功完成 [我已使用 mount 检查过]。为什么脚本的最后一行“不可见”?我找不到缺失的点。如何修复此问题?
提前感谢那些愿意提供帮助的人
编辑
我开始认为 umount /命令没有执行是因为我手动运行终止了进程:
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 是我的嵌入式系统的串行端口)意味着脚本的其余部分终止(甚至跳过了最后两个 echo 行)。手动执行 kill 行时,我必须再次登录,而启动脚本时不会发生这种情况。现在知道原因和修复方法就好了
答案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