Incluindo saída do processo no arquivo tar

3

Eu tenho um script bash simples para gerar um arquivo tar compactado e enviá-lo para um servidor externo para fins de backup. Além de arquivos no servidor, gostaria de incluir dumps de alguns bancos de dados mysql.

Devido a restrições de espaço em disco, não posso mais me dar ao luxo de pré-gerar os despejos de banco de dados em um arquivo no disco antes de gerar o arquivo tar. O que eu gostaria de fazer é de alguma forma transmitir os dumps diretamente para o tar.

Minha primeira tentativa foi tentar criar um pipe nomeado e tê-lo lido. Para cada banco de dados a ser descarregado, gere um pipe para um processo mysqldump:

mkfifo $DB.sql
mysqldump --result-file=$DB.sql $DB &
echo $DB.sql >>$FILELIST

Depois de gerar uma lista de todos os arquivos para backup:

tar c -P --files-from=$FILELIST | gzip | curl ...

Eu descobri que isso não funciona como eu esperava. O tar simplesmente gera uma entrada de pipe no arquivo, em vez de ler o conteúdo do pipe.

Não consegui encontrar nenhum parâmetro para tar para alterar o comportamento. Existe alguma maneira de obter tar para ler o pipe como se fosse um arquivo, ou existe algum outro utilitário que seria capaz de lidar com esse tipo de situação?

    
por kicken 27.05.2015 / 21:15

2 respostas

0

Eu estava pensando que você poderia usar um sistema de arquivos fuse ou algo assim, mas depois percebi que há um problema com isso em princípio e que é impossível fazer.

Você precisa que a saída de tar seja transmitida para um sistema remoto com curl , o que significa que tar deve ser capaz de gravar sua saída totalmente sequencialmente. Mas o formato de arquivo tar requer que cada membro do arquivo seja precedido por um cabeçalho que o descreve, e esse cabeçalho contém, entre outras coisas, o tamanho do membro. Mas se o conteúdo do arquivo membro for ele mesmo proveniente de um pipe, será impossível para tar saber antecipadamente qual será o tamanho e, portanto, impossível escrever o cabeçalho e prosseguir com os dados do arquivo.

    
por 27.05.2015 / 22:26
0

Não tenho certeza de que é isso que você quer. Ler de um tubo significa ler da entrada padrão. Isso é feito usando tar xf - (ou tar xzf - para fluxos compactados), em que - indica entrada padrão. Da mesma forma, escreva para a saída padrão: tar cf - (ou tar czf - ).

    
por 27.05.2015 / 22:12

Tags