Estoy escribiendo algunos scripts de shell para manejar algunas cosas de imagen de disco, y necesito usar dispositivos de bucle para acceder a algunas imágenes de disco. Sin embargo, no estoy seguro de cómo asignar correctamente un dispositivo de bucle sin exponer mi programa a una condición de carrera.
Sé que puedo usar losetup -f
para obtener el siguiente dispositivo de bucle sin asignar, y luego asignar ese dispositivo de bucle de esta manera:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Sin embargo, en el caso en que quiero ejecutar varias instancias del programa al mismo tiempo, este es casi un ejemplo de libro de texto de una condición de carrera, y eso me molesta bastante. Si tuviera varias instancias de este programa ejecutándose, u otros programas que también intentan obtener un dispositivo de bucle, entonces cada proceso podría no ser capaz de asignar el dispositivo de bucle antes de que la próxima llamada losetup -f
, en cuyo caso ambos procesos pensarían que el mismo bucle el dispositivo está disponible, pero solo uno puede obtenerlo.
Podría usar sincronización externa para esto, pero me gustaría (si es posible) evitar una complejidad adicional. Además, otros programas que usan dispositivos de bucle probablemente no respetarían la sincronización que se me ocurra.
¿Cómo puedo evitar esta posible condición de carrera? Idealmente, me gustaría poder descubrir y enlazar el dispositivo de bucle atómicamente, por ejemplo con un comando como:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Sin embargo, cuando hago eso, $ld
no se asigna a la ruta del dispositivo de bucle, y moverlo sudo
hacia afuera, como en sudo ld=$(losetup -f myfile.img)
da errores de permiso.
</dev/tty
de?