Qual é a maneira mais Unix-y para manipular stdout para um comando de backup que pode falhar?

1
Estou escrevendo um utilitário / script (em Python, como acontece) para executar no Linux, que faz o backup de dados de um servidor remoto, e as saídas para stdout. No momento, eu corro esse script na hora do cron e redireciono a saída para um arquivo, assim:

./mybackupscript > ~/backups/mybackupfile

Às vezes, o backup falhará (por exemplo, a conexão de rede está inativa ou o servidor remoto expira) - isso significa que o conteúdo do stdout está incompleto ou ausente. O utilitário é bem comportado - quando isso acontece, ele sai com um código de saída diferente de zero. No entanto, o arquivo de backup ainda está vazio ou incompleto. Eu preferiria que ele retenha seu conteúdo original (da última execução bem-sucedida do meu script).

Qual é a maneira mais apropriada de lidar com esse problema "Unix-y", para tornar o backup mais robusto? Devo enviar para um arquivo temporário e copiá-lo sobre o arquivo final apenas se o backup funcionar?

    
por Andrew Ferrier 29.01.2015 / 14:12

1 resposta

4

Should I output to a temporary file, then copy it over the final file only if the backup works?

Não copie, mas renomeie.

Mas isso é impossível para o script de backup se ele gravar em stdout . Ele não pode impedir que o arquivo vazio seja criado, como já aconteceu quando o script é iniciado. Isso deve ser feito do lado de fora.

if ./script.sh >backup.tmp; then
  mv backup.tmp backup
else
  rm backup.tmp
fi
    
por 29.01.2015 / 14:16