如何在挂载、复制文件和卸载镜像时避免竞争条件

如何在挂载、复制文件和卸载镜像时避免竞争条件

该脚本创建了十个图像文件并将文件复制到其中。

#!/bin/bash
# script to create multiple floppy images for installing hwp30
#+on virtualbox.

# umount image in case mounted
sudo umount /media/floppy

# create ten blank 2.88mb images.
#+then mount each image and copy over file(s).
for n in {1..10}; do
    mkfs.msdos -C "hwp30-${n}.img" 2880
    sudo mount -o loop "hwp30-${n}.img" /media/floppy
    sudo cp -v "../DISK${n}" /media/floppy

    # if first disk then copy over INSTALL.EXE
    if [[ $n -eq 1 ]]; then
        sudo cp -v ../INSTALL* /media/floppy
    fi
    
    sudo umount /media/floppy
done

# done?
if [[ $? -eq 0 ]]; then
    echo "done!"
fi

当我运行此脚本时,挂载、复制文件和卸载不同步;它们没有按照正确的顺序完成。卸载时几次显示“设备正忙”。

脚本完成后,我需要执行umount几次命令来卸载它们(即使是相同的挂载点?)。

我认为这叫做竞争条件。 怎么修?

答案1

问题可能是,即使复制已完成,仍然有从缓存到已安装映像的 IO 正在进行。

sync; sync在该行之前添加sudo umount /media/floppy.. 这将请求刷新未写入的数据 - 并等待它发生。

相关内容