Como redirecionar a saída para um arquivo ao criar tar no Solaris?

2

Estou criando um arquivo tar.gz no Solaris usando o comando abaixo para redirecionar a saída.

cd /ebs/datatop && tar cvf - * | gzip -c > /ebs/backup/proddata.tar.gz >> /dev/null 2>> error.log

Quando executado, está criando /ebs/backup/proddata.tar.gz como um arquivo vazio. Não apresenta erros. Estou assumindo que os arquivos tar estão sendo redirecionados para /dev/null . Eu quero redirecionar apenas a saída do comando para /dev/null e gravar erros em error.log.

    
por Girish Sunkara 02.05.2017 / 11:47

1 resposta

6

A saída de tar cvf - é o arquivo. Ao especificar - como o argumento para f , você está informando tar para gerar o arquivamento no stdout (e, nesse caso, devido ao% stdout, |gzip , tar é um canal para gzip ).

A saída v erbose (a lista de arquivos) que você pediu com v passa a ser como mensagens de erro porque não pode continuar no stdout, pois isso iria para gzip e para o tar.gz Arquivo. Observe também que seu 2> error.log apenas redireciona gzip ' stderr .

Se você não quiser a lista detalhada de arquivos (o que eu suponho que você quer dizer com output ), apenas omita o v . E redirecione um sub-grupo ou stderr do grupo de comandos se desejar que as mensagens de erro de cd , tar e gzip (e a abertura do shell do arquivo de saída) sejam enviadas para o arquivo de log:

(cd /ebs/datatop &&
   tar cf - . | gzip > /ebs/backup/proddata.tar.gz) 2>> error.log

Também substituí * por . para arquivar o diretório atual. * seria apenas expandido para os arquivos não ocultos e causaria problemas em alguns nomes de arquivos.

O error.log será armazenado no diretório de trabalho atual antes desse cd . Na sua abordagem, esse error.log teria sido armazenado no arquivo tar.gz .

Se você quisesse redirecionar essa lista de arquivos (com v ou vv ) para algum arquivo, e os erros para algum outro arquivo, você precisaria usar um argumento diferente de - para o f flag. Por exemplo, usando esta sintaxe em sistemas com suporte para /dev/fd/n :

(tar cvvf /dev/fd/3 . 3>&1 > ../file.list | gzip > ../file.tar.gz) 2> ../error.log

Acima, /dev/fd/3 ainda se refere ao canal para gzip (já que cuidamos de redirecionar o descritor de arquivo 3 para ele (com 3>&1 ) antes de redirecionar o stdout para ../file.list ), mas já que não está mais dizendo tar para enviar o arquivo em seu stdout, tar está livre para escrever a lista de arquivos em stdout (que nós redirecionamos para ../file.list ).

    
por 02.05.2017 / 12:08