Quero ter um arquivo usado como contador. O usuário A gravará e incrementará esse número, enquanto o usuário B solicitará a leitura do arquivo. É possível que o Usuário A possa bloquear esse arquivo para que ninguém possa ler ou gravar nele até a gravação do Usuário A terminar?
Eu examinei, flock
mas não consigo fazê-lo funcionar como eu esperava.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
Se houver uma maneira mais apropriada de obter esse arquivo de incremento atômico, também seria ótimo ouvir isso!
Minha meta é:
LOCK counter.txt; write to counter.txt;
enquanto ao mesmo tempo
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- b
fonte
fonte
&& sleep 5
é executado depois que o rebanho libera a trava.) #flock
, mas vou colocar isso como uma pergunta separada. Obrigado John!Respostas:
O processamento do comando abaixo por Bash pode ser surpreendente:
O Bash é executado primeiro
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
e, se isso for concluído com êxito (liberando o bloqueio), ele será executadosleep 5
. Assim, o bloqueio não é mantido pelos 5 segundos que se pode esperar.Além de
&
versus&&
Se houver dois comandos,
A
eB
:A & B
iniciaA
em segundo plano e, em seguida, iniciaB
sem esperar paraA
terminar.A && B
iniciaA
, aguarda a conclusão e, se concluir com êxito (código de saída 0), iniciaB
. SeA
falhar (código de saída diferente de zero),B
nunca será executado.Em suma,
&
e&&
são dois operadores de lista completamente diferentes.fonte
A && B
,A
esperariaB
terminar.Bloqueios de arquivo não são obrigatórios 1 - ou seja, você não pode bloquear um arquivo para que outro processo não possa acessá-lo. Bloquear um arquivo significa que se um processo (outro) verificar se ele foi bloqueado, ele saberá.
O objetivo
flock
é fazer coisas como o que você deseja, mas você deve usá-loflock
para cada tentativa de acesso . Lembre-se de que estão bloqueando chamadas; deman flock
:1. O que faz com que o recurso pareça inútil se você o estiver usando para, por exemplo, segurança, mas esse não é o objetivo dos bloqueios de arquivo - eles são para sincronização, e é isso que você está fazendo. O usuário Leo apontou que pode haver uma implementação não padronizada de bloqueio obrigatório de arquivos no kernel do linux ( consulte esta discussão ), com base em paralelos históricos de outros sistemas operacionais * nix. No entanto, isso parece ser apenas uma interface de nível C.
fonte
flock
cada vez. muito útil!Você pode usar "sh -c command ..." para executar o comando shell inteiro, incluindo o redirecionamento de arquivo, com o bloqueio pressionado. Além disso, como você está usando o arquivo como um contador, mantenha a trava continuamente enquanto faz a leitura e a gravação novamente. Então, você gostaria de fazer algo assim para incrementar o contador e retornar seu novo valor:
Alterar os sinais de mais para menos deve diminuir o contador:
Espero que você inicialize o contador antes que qualquer disputa possa ocorrer, portanto, não será necessário se preocupar com o bloqueio tão cedo:
Eu não acho que você precisaria ignorar o valor do contador enquanto a disputa poderia ocorrer, mas, se você já fez, deve fazê-lo da seguinte maneira:
Eu acho que você entende como fazer a leitura, mas eu a incluo para completar:
fonte