Com toda probabilidade, seu script às vezes é acionado ao mesmo tempo em que o arquivo está sendo gravado. Quando cat
é executado, ele copia os dados que estão atualmente lá. Não tem como saber que mais dados serão adicionados posteriormente.
Para evitar isso, supondo que os arquivos sejam produzidos rapidamente, a melhor maneira é alterar o programa que está produzindo os dados. Em vez de gravar diretamente no nome final, grave em um arquivo temporário e renomeie o arquivo temporário quando todos os dados estiverem presentes, por exemplo,
gather_data --origin=somewhere >somewhere.stat.tmp &&
mv somewhere.stat.tmp somewhere.stat
Se você não puder alterar o processo de produção, poderá reagir aos arquivos sendo fechados usando inotify . Dependendo de como esses arquivos são criados e removidos, talvez faça mais sentido usar incron , por exemplo você pode usar esta linha incrontab:
/share/scripts/stats IN_CLOSE_WRITE case $@/$# in *.stat) new_stat_file $@/$# esac
new_stat_file
seria um script que incorpora o novo arquivo. Não basta executar algo como cat *.stat
, porque ele também pode pegar arquivos parciais. Renomeie os arquivos ou uma cópia dos arquivos, por exemplo,
/share/scripts/stats IN_CLOSE_WRITE case $@/$# in *.stat) ln $@/$# /share/scripts/stats/ready/; esac
e, em seguida, pegue os arquivos em /share/scripts/stats/ready
em vez de /share/scripts/stats
.