Dies ist das Problem der Essensphilosophen . Durch das Sortieren der Sperren implementieren Sie eine Lösung für die Ressourcenhierarchie .
Während die Lösung für Ressourcenhierarchien Deadlocks vermeidet, ist dies nicht immer praktikabel, insbesondere wenn die Liste der benötigten Ressourcen nicht vollständig bekannt ist.
Es sieht so aus, als wäre es robust, wenn nur Sie Ihre Ressourcen sortieren und dabei bleiben können.
Eine Problemumgehung kann darin bestehen, nicht flock
unbegrenzt warten zu lassen, dann eine Logik hinzuzufügen, um Fälle zu erkennen, wenn das Programm beendet wurde, weil es eine Datei nicht sperren konnte, und die gesamte Aufgabe beispielsweise nach einer zufälligen Zeit wiederholt wird.
In man flock
einem kann man sehen:
-n
,--nb
,--nonblock
Ausfallen (mit einem Exit - Code1
) anstatt warten, wenn die Sperre nicht sofort erworben werden kann.
-w
,--wait
,--timeout seconds
Ausfallen (mit einem Exit - Code1
), wenn die Sperre nicht innerhalb von Sekunden Sekunden erfaßt werden. Dezimale gebrochene Werte sind zulässig.
Das Problem ist: Ein möglicher Exit-Code von 1
kann von jedem flock
oder von dem zugrundeliegenden Befehl kommen. Wenn Ihr flock
Träger -E
einen benutzerdefinierten Exit - Code angeben - es vielleicht verwenden.
Dies ist ein einfaches Beispiel für den Ansatz:
while ! flock -n -x file <command> ; do sleep $(($RANDOM%5)) ; done
Sie können mehrere flock
-s verwenden. Wenn einer von ihnen die Datei nicht sperren kann, werden alle Sperren aufgehoben und die gesamte Zeile wartet auf sleep
, nicht auf flock
; Zu diesem Zeitpunkt wird keine weitere, parallel ausgeführte Zeile blockiert.