Fazendo backup de um arquivo grande

1

Eu tenho um teste em execução que falha. Eu preciso descobrir o quão longe chegou antes de bater. Ele será reiniciado novamente após travar e limpar o arquivo de log. Esta limpeza leva 10 minutos embora. Então, se eu estou salvando o arquivo de log a cada 9 minutos, eu deveria ser capaz de obter o arquivo de log.

O problema é que como eu escrevo um script bash para copiar um arquivo de log para um local específico e sobrescrever um arquivo existente (se houver) somente se o arquivo que está sendo copiado for maior que o arquivo no destino. Senão eu quero deixar isso em paz.

 25       if [ -f $testFile ]; then
 26         COUNT='cat $testFile|wc -l'
 27                 if [ $COUNT -gt 0 ];then
 28                     ARGS='head -1 $testFile'
 29                     echo "Executing test for ARGS"
 30                     sed -i '1d' $testFile
 31                     cd /testCode; sleep 600

Neste ponto, o código dorme por 10 minutos, como mencionado

 32                     /testCode/startTest.sh $ARGS

Isso inicia o teste que remove o arquivo de log. Se o teste não travar, quando o teste for feito, ele irá para o próximo comando. Senão começa de novo do topo

 33                     'wall "System is going down for reboot in 600 seconds. Please save your work"'
 34                     sleep 600
 35                     /sbin/reboot &
 36                     exit 0
 37                 fi
 38 fi

UPDATE # 1

Eu descobri um jeito. Então, quando o teste começa, eu salvo os logs da execução anterior. Então eu tenho tempo suficiente para verificar os logs enquanto o teste foi reiniciado. O teste geralmente falha depois de uma hora ou mais com segfaults. Isso me dá tempo suficiente para verificar os logs.

Não é uma maneira realmente limpa, mas funcionará. @Lexandre Alves também deu uma boa resposta. Isso pode funcionar também. @Slm deu uma boa resposta, mas infelizmente isso não funcionará em grandes testes como o meu, já que isso vai sobrecarregar o arquivo de log.

Além disso, meu problema é salvar o arquivo de registro, não o registro em si.

    
por Alastor Moody 27.08.2013 / 20:26

2 respostas

1

Gostaria de ativar a depuração para a linha que inicia o teste onde está falhando. Você pode usar uma das técnicas descritas abaixo:

  1. Depure todo o script do script de chamada

    bash -x /testCode/startTest.sh $ARGS
    
  2. Depurar o próprio script

    Ou se você tiver o controle desse script, adicione a linha shebang no topo da seguinte forma:

    #!/bin/bash -x
    
  3. Depuração de seções específicas do código

    Ou você pode fazer isso em torno de seções do script em que deseja mais verbosidade:

    line1
    line2
    
    set -x
    line3
    line4
    set +x
    
    line5
    
por 27.08.2013 / 21:26
1

Eu estou supondo que você não pode mudar a forma como o teste registra seu arquivo de log.

Mas posso sugerir duas maneiras de fazer isso:

  1. Se você realmente quer um script bash, então

    #!/bin/bash
    source_size='du -b file1|cut -f 1'
    destin_size='du -b file2|cut -f 1'
    if [ $source_size -gt $destin_size ]; then
        mv file1 file1.bck
        touch file1
        cp file1.bck /destination/file2
        rm file1.bck
    fi
    

    Note que estou fazendo o movimento e copie o arquivo, porque se você estiver movendo o arquivo entre sistemas de arquivos diferentes, ele terá que copiar e excluir. Isso significa que você pode se deparar com a situação do arquivo sendo sobrescrito pelo teste enquanto está sendo movido.

  2. Usando o tee

    Se você sabe quando o problema está prestes a acontecer, você pode fazer

    tail -f logfile |tee newlog
    

    Isto mostrará ao stout o arquivo de registro enquanto escreve ao mesmo tempo no arquivo newlog.

  3. Altere a maneira como o teste cria os arquivos de log para executar a rotação do arquivo de log.

por 27.08.2013 / 20:48