我的makefile:
make:
# Mount Loader.bin
sudo mount -t vfat -o loop Boot.img mnt
sudo cp Loader.bin mnt
sudo umount mnt
但是,结果显示“目标繁忙”错误
$ make make
sudo mount -t vfat -o loop Boot.img mnt
[sudo] password for shore:
sudo cp Loader.bin mnt
sudo umount mnt
umount: /home/shore/MineOS/mnt: target is busy.
makefile:7: recipe for target 'make' failed
make: *** [make] Error 32
它是随机发生的,我想主要的想法是在复制过程中执行unmountant。
因此,我想问一下是否有办法等待上一个命令完成然后执行下一个命令
顺便说一句,我的平台是Ubuntu 18.4
非常感谢!
答案 0 :(得分:3)
make一次只能在配方中运行一行,并且总是等待上一行完成,然后再运行下一行。它必须等待,因为如果当前行失败,则配方必须失败而无需开始下一行。
可能正在发生的情况是cp
正在退出,但是数据尚未完全刷新到已挂载的文件系统:内核仍在写出缓冲的数据。因此,即使复制命令已完成,分区仍很忙。
也许您可以使用类似的方式(在这里我假设您使用的是GNU / Linux或兼容的方式)强制其同步:
make:
# Mount Loader.bin
sudo mount -t vfat -o loop Boot.img mnt
sudo cp Loader.bin mnt
sudo sync -f mnt/Loader.bin
sudo umount mnt
我不知道这是否足以强制执行。
顺便说一句,在制作文件或任何其他非交互式环境中使用sudo -n
时,通常最好使用sudo
。