executa uma leitura somente se o arquivo estiver fechado

3

Estou enfrentando um problema em que tenho que escrever um script de shell para ler um arquivo somente se ele não for usado ou estiver sob gravação por outro programa. Eu não posso usar lsof como este script vai rodar no hardware embarcado executando o QNX com funcionalidades muito básicas de shell, portanto nenhuma ferramenta e biblioteca de terceiros.

    
por abhishek mishra 19.02.2018 / 06:29

3 respostas

0

Eu acho que tenho a resposta. Coloque isso como parte do seu script:

#!/bin/bash
# Script to prevent writing to a certain file.  
# This should be adjusted to your needs, replace all /paths/ and <xxxxxxx> 
# with your true paths and filenames.  
chmod +r /path_to_file/<filename>
<now_do_what_you_want_with_that_file, command(s) here>
for a in {120..1}; do echo -n "$a..." && sleep 1; done    # In 120 seconds <filename> will be writable.
chmod -r /path_to_file/<filename>

Além disso, um script pode ser criado para copiar esse arquivo para outro local, depois ler sua cópia, que não está aberta nem em uso , e após terminar, excluí-lo após X segundos.

Isso pode ser repetido o quanto você quiser, se necessário.

    
por 19.02.2018 / 10:33
0

Se você não sabe se o arquivo está atualmente escrito e não tem a chance de descobrir se um programa está usando, você pode pensar em verificar o ctime, mtime e atime. Você pode fazer isso com o comando "stat", que deve estar disponível na maioria dos sistemas. Você pode verificá-lo 3-4 vezes e se não houver diferença, escreva-o. Observe que o atime (tempo de acesso) sempre mudará, desde que você verifique!

Outra ideia é fazer uma cópia do arquivo e trabalhar com essa cópia. Depois de fazer suas coisas, faça uma cópia da sua cópia modificada e do original e substitua-a se não houver outras alterações. Senão, você pode tentar trabalhar com "diff" e "patch". Eu recomendo fazer um backup antes de fazer isso!

    
por 19.02.2018 / 11:04
0

Isenção de responsabilidade: não sei muito sobre o QNX e muito menos sobre dispositivos incorporados.

O que você está perguntando é basicamente sobre o bloqueio de arquivo: Um processo tenta adquirir um bloqueio compartilhado (bloqueio de leitura) em um arquivo de bloqueio para executar algumas operações. Se um bloqueio exclusivo (bloqueio de gravação) for mantido no mesmo bloqueio por outro processo, o primeiro processo será bloqueado até que o bloqueio exclusivo seja liberado. Ou invertido, um processo pode adquirir um bloqueio exclusivo somente se não houver outros processos com bloqueios compartilhados / exclusivos ativos compartilhados.

Para fazer obrigatório bloqueio de arquivos, isso tem que ser suportado pelo kernel. Existem muito poucos sistemas Unix que implementam isso de uma maneira confiável a partir de um script de shell (para Linux, veja este texto de 2007, e esta questão no StackOverflow).

O bloqueio de

Advisory é implementado no espaço do usuário por programas como flock . Esse tipo de bloqueio de arquivo requer processos para cooperar , o que significa que eles precisarão solicitar explicitamente o acesso de leitura ou gravação ao arquivo de bloqueio. Ao mesmo tempo, um processo não cooperativo pode ainda ignorar o mecanismo de bloqueio.

A pergunta " Flock parece não estar funcionando "é sobre bloqueio consultivo usando flock no shell.

Veja também: Quais comandos Unix podem ser usado como um semáforo / bloqueio? (isso também é sobre bloqueio de aviso, e algumas respostas estão usando mkdir para essa finalidade, pois é uma operação atômica).

    
por 19.02.2018 / 11:11

Tags