Determina se o arquivo está sendo gravado nele - Linux

2

Precisa de comando no linux para determinar se o arquivo está sendo gravado nele.

Nós usamos um script para backup de dados e está funcionando bem. Agora eu preciso de uma maneira inteligente de copiar o arquivo de backup (digamos file.csv para ser copiado para outro local). Então, eu preciso de um comando que garanta que, se o arquivo (file.csv) terminar de ser escrito, após a gravação apenas, eu preciso copiar isso para outro local.

Obrigado pela sua ajuda antecipadamente. Se é confuso, posso elaborá-lo.

    
por user1430701 26.03.2014 / 06:13

3 respostas

2

O que você quer é o Incron:

link

O Incron pode escutar eventos específicos do sistema de arquivos e executar ações em eventos correspondentes.

    
por 26.03.2014 / 06:24
2

Você pode usar o status lsof ou fuser para determinar se o arquivo está aberto.

Algo como:

lsof /path/to/csv.txt || backup_script.sh ou% fuser /path/to/csv.txt || backup_script.sh em um loop seria o equivalente a: Execute o script de backup somente se esse arquivo não estiver aberto.

    
por 26.03.2014 / 06:31
2

Você pode querer usar algum tipo de bloqueio.

Se você controlar os escritores (pelo menos da forma como eles são iniciados) considere usar flock .

A maneira mais simples é usar a ferramenta de linha de comando flock :

  • para executar o writer (ou muitos escritores) com flock --shared <file> <writing_command> É importante usar --shared aqui para permitir que vários processos independentes obtenham o bloqueio.
  • para executar seu script de backup com flock --exclusive <file> <backup_script>

Isso impedirá que o script de backup seja iniciado quando o bloqueio compartilhado for mantido por outros processos. Ao mesmo tempo, o bloqueio compartilhado não pode ser adquirido quando um exclusivo está sendo mantido. Isso atrasará o início do gravador até que esse bloqueio seja liberado

A solução de linha de comando tem algumas limitações:

  1. Ele só funcionará se pelo menos um dos itens a seguir for verdadeiro:

    • process (escritor ou script de backup) não daemonize
    • ou não fecha seus identificadores de arquivo

    Caso contrário, quando o processo perde o bloqueio, fechando o identificador e daemoniza seu pai (o flock process) também morre, finalmente liberando esse bloqueio.

  2. Isso não é muito útil em processos de longa execução. Como os processos não estão cientes do bloqueio, eles não podem liberar esse bloqueio durante a execução. Então, o bloqueio é mantido continuamente, mesmo que o processo não grave no arquivo

Outra solução final, mais complicada, mas muito mais poderosa, é implementar todos os códigos de gravação de arquivos acima. Isso permitirá que você adquira o bloqueio apenas pelo período necessário, liberando-o logo após a conclusão da transação. Dê uma olhada em manuais específicos de idiomas sobre o bando.

Apenas poucas coisas que você pode querer saber:

  • os bloqueios são anexados aos identificadores de arquivo, portanto, o fechamento do arquivo resultará na liberação do bloqueio
  • os bloqueios são herdados, portanto, todos os filhos do processo estão mantendo o mesmo bloqueio
  • A herança de bloqueios é resultado da herança de alças. Isso também significa que liberar o bloqueio em um identificador em um filho - esses bloqueios são voluntários e não impedem o acesso direto ao arquivo sem obter um bloqueio, portanto isso funcionará somente se cada processo envolvido obtiver o bloqueio de liberação de bloqueio apropriado no pai

Você também pode querer dar uma olhada no bloqueio obrigatório com fcntl , mas sabe-se que ele não é confiável nos kernels linux atuais

    
por 26.03.2014 / 21:29

Tags