é possível bloquear um arquivo no linux para que ele não possa ser lido se outro processo o tiver aberto para gravação?

1

Todos nós sabemos que o Linux / Unix bloqueará automaticamente as tentativas de gravar em um arquivo que atualmente está aberto para gravação por outro processo. Mas é possível bloquear / bloquear acesso de leitura a um arquivo se outro processo o tiver aberto para gravação? Eu tenho dois scripts diferentes, ambos começam em horários aleatórios e executam várias vezes durante o dia: um script substitui um arquivo específico; o outro lê desse arquivo. Eu quero que o segundo bloqueie (espere) ou falhe se o primeiro tiver o arquivo aberto.

    
por Michael Martinez 29.09.2016 / 19:02

2 respostas

2

O utilitário flock (1) pode fazer o que você quiser

  • Pegue um bloqueio de gravação no arquivo quando quiser sobrescrevê-lo

    flock -x / caminho / para / arquivo de bloqueio do arquivo de som

  • Peça ao outro comando para verificar o bloqueio.

    flock -n / path / para / lockfile outro arquivo de comando

Se o arquivo estiver bloqueado, você receberá um código de saída 1, caso contrário, será seu e poderá fazer o que quiser com ele

    
por 29.09.2016 / 19:17
0

Desde que você tenha concluído a un-synchronize running .. Você poderia fazer algo simples que é ter o processo de "escrita" criar o novo arquivo com um nome temporário, digamos .tmp, então se o arquivo que ele criar for output1.txt ele funcionaria em output1.txt.tmp.

Uma vez que o escritor está pronto, a última coisa que faz é um comando mv.

A partir daqui você pode fazer duas coisas. Um tem o leitor não se importa porque desde que o arquivo tmp é um inode diferente, o mv não vai machucá-lo (o Linux irá mantê-lo ativo enquanto ele tiver um consumidor) e a próxima leitura terá o novo arquivo ..

(desde que não faça mal você rodar com o arquivo antigo uma última vez).

A outra opção é que o leitor procura pelo arquivo tmp e bloqueia enquanto esse arquivo existe (isso se tornando uma espécie de arquivo de bloqueio).

    
por 29.09.2016 / 19:07