cat multiple file no script trunca dados quando agendados no cron

0

Estou catando vários arquivos em um script bash no OEL 6.

for f in /share/scripts/stats/*.stat; do (cat "${f}"; echo) >>   /share/scripts/stats/finalmail.html; done

Quando o script é acionado manualmente, ele anexa todos os arquivos perfeitamente. Mas quando o script é executado a partir do cron (a cada 5 minutos) às vezes (~ 10% do tempo), somente parte dos dados de 1-2 arquivos é anexada. Eu tentei listar o tamanho do arquivo de cada um antes dessa operação de gato ser chamada. O tamanho final do arquivo, às vezes, não é a soma de todos os tamanhos de arquivo.

    
por Abhijit 19.11.2016 / 11:19

1 resposta

0

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 .

    
por 20.11.2016 / 00:47