O que você quer é o Incron:
O Incron pode escutar eventos específicos do sistema de arquivos e executar ações em eventos correspondentes.
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.
O que você quer é o Incron:
O Incron pode escutar eventos específicos do sistema de arquivos e executar ações em eventos correspondentes.
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.
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
:
flock --shared <file> <writing_command>
É importante usar --shared
aqui para permitir que vários processos independentes obtenham o bloqueio. 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:
Ele só funcionará se pelo menos um dos itens a seguir for verdadeiro:
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.
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:
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
Tags linux