Sto scrivendo alcuni script di shell per gestire alcune cose relative alle immagini del disco e ho bisogno di usare dispositivi loop per accedere ad alcune immagini del disco. Tuttavia, non sono sicuro di come allocare correttamente un dispositivo loop senza esporre il mio programma a una condizione di gara.
So che posso usare losetup -f
per ottenere il prossimo dispositivo loop non allocato e quindi allocare quel dispositivo loop in questo modo:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Tuttavia, nel caso in cui voglio eseguire più istanze del programma contemporaneamente, questo è quasi un esempio da manuale di una condizione di gara, e questo mi preoccupa parecchio. Se avessi istanze multiple di questo programma in esecuzione, o altri programmi che cercassero di ottenere anche un dispositivo loop, ogni processo potrebbe non essere in grado di allocare il dispositivo loop prima che il successivo richiami losetup -f
, nel qual caso entrambi i processi penserebbero che lo stesso loop il dispositivo è disponibile, ma solo uno può ottenerlo.
Potrei usare la sincronizzazione esterna per questo, ma vorrei (se possibile) evitare ulteriore complessità. Inoltre, altri programmi che usano dispositivi a circuito chiuso non rispetterebbero probabilmente qualsiasi sincronizzazione che mi venga in mente.
Come posso evitare questa potenziale condizione di gara? Idealmente, vorrei essere in grado di scoprire e associare atomicamente il dispositivo loop, ad esempio con un comando come:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Tuttavia, quando lo faccio, $ld
non mi viene assegnato il percorso del dispositivo loop e lo spostamento sudo
, come in sudo ld=$(losetup -f myfile.img)
dà errori di autorizzazione.
</dev/tty
?