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.