Ich schreibe einige Shell-Skripte, um einige Disk-Image-Inhalte zu verarbeiten, und ich muss Loop-Geräte verwenden, um auf einige Disk-Images zuzugreifen. Ich bin mir jedoch nicht sicher, wie ich ein Loop-Gerät richtig zuordnen soll, ohne mein Programm einer Race-Bedingung auszusetzen.
Ich weiß, dass ich losetup -f
das nächste nicht zugewiesene Schleifengerät abrufen und dieses Schleifengerät dann wie folgt zuweisen kann:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Wenn ich jedoch mehrere Instanzen des Programms gleichzeitig ausführen möchte, ist dies fast ein Lehrbuchbeispiel für eine Rennbedingung, und das stört mich sehr. Wenn mehrere Instanzen dieses Programms ausgeführt würden oder andere Programme versuchen würden, auch ein Schleifengerät zu erhalten, könnte möglicherweise nicht jeder Prozess das Schleifengerät zuordnen, bevor der nächste Aufruf losetup -f
erfolgt. In diesem Fall würden beide Prozesse annehmen, dass dieselbe Schleife vorhanden ist Gerät ist verfügbar, aber nur einer kann es bekommen.
Ich könnte hierfür eine externe Synchronisation verwenden, möchte aber (wenn möglich) zusätzliche Komplexität vermeiden. Auch andere Programme, die Loop-Geräte verwenden, würden wahrscheinlich nicht die Synchronisation berücksichtigen, die ich mir einfallen lassen könnte.
Wie kann ich diese potenzielle Rennbedingung vermeiden? Idealerweise möchte ich das Schleifengerät atomar erkennen und binden können, beispielsweise mit einem Befehl wie:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Wenn ich das mache, wird es $ld
jedoch nicht dem Loop-Gerätepfad zugewiesen, und das Verschieben des sudo
Outs, wie in, sudo ld=$(losetup -f myfile.img)
gibt Berechtigungsfehler.
</dev/tty
?