Este é o problema dos filósofos de refeições . Ao classificar os bloqueios, você implementa a solução de hierarquia de recursos .
While the resource hierarchy solution avoids deadlocks, it is not always practical, especially when the list of required resources is not completely known in advance.
Parece que é robusto se você puder classificar seus recursos e ficar com eles.
Uma solução alternativa pode não permitir que flock
aguarde indefinidamente e, em seguida, adicionar alguma lógica para detectar casos quando ele é encerrado porque não foi possível bloquear um arquivo e, por exemplo, repita toda a tarefa depois de algum tempo aleatório.
Em man flock
pode-se ver:
-n
,--nb
,--nonblock
Fail (with an exit code of1
) rather than wait if the lock cannot be immediately acquired.
-w
,--wait
,--timeout seconds
Fail (with an exit code of1
) if the lock cannot be acquired within seconds seconds. Decimal fractional values are allowed.
O problema é: um possível código de saída de 1
pode vir de qualquer flock
ou do comando subjacente. Se o seu flock
suportar -E
para especificar um código de saída personalizado, use-o talvez.
Este é um exemplo simples da abordagem:
while ! flock -n -x file <command> ; do sleep $(($RANDOM%5)) ; done
Você pode usar vários flock
-s. Se algum deles não puder bloquear o arquivo, todos os bloqueios serão liberados e toda a linha aguardará em sleep
, não em flock
; neste momento, não bloqueará outra linha semelhante executada em paralelo.