【问题标题】:GNU make: How to wait "cp" command to finishGNU make:如何等待“cp”命令完成
【发布时间】:2019-07-07 00:30:37
【问题描述】:

我的生成文件:

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

它是随机发生的,我猜主要思想是在复制过程中执行卸载。

所以我想问一下有没有办法让它等待上一个命令完成然后执行下一个命令

顺便说一下,我的平台是 Ubuntu 18.4

非常感谢!!

【问题讨论】:

    标签: bash ubuntu makefile gnu-make


    【解决方案1】:

    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
    

    我不知道这是否足以强迫它。

    顺便说一句,当您在 makefile 或任何其他非交互式环境中使用 sudo 时,使用 sudo -n 通常是个好主意。

    【讨论】:

    • 嗨,我认为你是对的,但是代码不起作用,同样的问题发生了。我目前的方法是睡0.5,请问有更好的方法吗?谢谢~
    • 如果它失败了,从某个时间重试怎么样? for ((i=0; i<10; i++)); do umount mnt && break; sleep 0.2; done.
    • 您也可以使用选项-l 懒惰地卸载。这将从目录层次结构中快速删除 FS,并在卸载失败的原因消失后立即卸载它。
    • @Shore 重试与单纯的睡眠并不完全相同,但它当然与此解决方案共享一些属性。
    • @Alfe 是的,我可以试试......我想知道 cp 是否有一些选项可以在复制过程后退出......
    猜你喜欢
    • 2011-10-20
    • 2023-04-04
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2013-04-03
    • 2015-06-13
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多