我正在编写一些Shell脚本来处理某些磁盘映像内容,并且需要使用循环设备来访问某些磁盘映像。但是,我不确定如何在不使程序处于竞争状态的情况下正确分配循环设备。
我知道我可以losetup -f
用来获取下一个未分配的循环设备,然后像这样分配该循环设备:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
但是,在我想同时运行程序的多个实例的情况下,这几乎是关于竞赛条件的教科书示例,这让我非常困扰。如果我正在运行该程序的多个实例,或者其他程序也试图获取一个循环设备,则每个进程可能无法在下一个调用之前分配循环设备losetup -f
,在这种情况下,两个进程都将认为同一循环设备可用,但只有一个设备可以使用。
我可以为此使用外部同步,但是我想(如果可能)避免额外的复杂性。同样,其他使用循环设备的程序也不太可能遵循我可能提出的任何同步要求。
如何避免这种潜在的比赛状况?理想情况下,我希望能够以原子方式发现和绑定循环设备,例如,使用以下命令:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
但是,当我这样做时,$ld
不会分配给循环设备路径sudo
,而是将其移出,因为这样会导致sudo ld=$(losetup -f myfile.img)
权限错误。
</dev/tty
用