como executar mais de um comando tar para execução paralela?

6

Eu quero tar quatro diretórios que contêm grande número de pequenos arquivos usando um script de shell. Devido a esse script demorar muito para ser executado, quero fazer com que esses 4 comandos tar sejam executados em paralelo usando o shell script, esperando que eu possa fazer um melhor uso dos recursos disponíveis.

Comandos que estou usando atualmente:

tar cf - /ebs/uat/uatappl | gzip -c > /ebs/backup/uatappl.tar.gz
tar cf - /ebs/uat/uatcomn | gzip -c > /ebs/backup/uatcomn.tar.gz
tar cf - /ebs/uat/uatora | gzip -c > /ebs/backup/uatora.tar.gz
tar cf - /ebs/uat/uatdata | gzip -c > /ebs/backup/uatdata.tar.gz
    
por Girish Sunkara 03.05.2017 / 09:00

4 respostas

7

Você pode colocar todos os tars em segundo plano assim:

tar cf - /ebs/uat/uatappl | gzip -c > /ebs/backup/uatappl.tar.gz &
tar cf - /ebs/uat/uatcomn | gzip -c > /ebs/backup/uatcomn.tar.gz &
tar cf - /ebs/uat/uatora | gzip -c > /ebs/backup/uatora.tar.gz &
tar cf - /ebs/uat/uatdata | gzip -c > /ebs/backup/uatdata.tar.gz &

Mas esteja ciente de que você deve ter potência de processamento e disco rápido suficientes, caso contrário, a simultaneidade fará com que a execução total seja mais longa que a consecutiva

    
por 03.05.2017 / 09:25
4

o que há de errado em adicionar um & no final da linha de comando?

tar cf - /ebs/uat/uatappl | gzip -c > /ebs/backup/uatappl.tar.gz &
tar cf - /ebs/uat/uatcomn | gzip -c > /ebs/backup/uatcomn.tar.gz &
tar cf - /ebs/uat/uatora | gzip -c > /ebs/backup/uatora.tar.gz &
tar cf - /ebs/uat/uatdata | gzip -c > /ebs/backup/uatdata.tar.gz &

wait

wait aguardará a conclusão do trabalho.

    
por 03.05.2017 / 09:25
3

Você pode usar o GNU paralelo, que é uma ferramenta para executar trabalhos em paralelo. Eu testei o abaixo, e acredito que este one-liner funcionaria:

ls -1 /ebs/uat | parallel 'tar cf - /ebs/uat/{} | gzip -c > /ebs/backup/{}.tar.gz'

A página da Web está aqui: link , e um rápido google aparece para sugerir que há pacotes de solaris disponíveis, para que você talvez nem precise instalá-lo manualmente.

    
por 03.05.2017 / 23:34
1

Desde que você adicionou uma tag do Solaris, qual versão você está usando? Assim como o (s) sistema (s) de arquivos que você está usando? Se for UFS, você pode migrar para o ZFS, que manipula muitos arquivos menores melhor do que o UFS. Pode ter sido Roche quem comparou isso.

ie: se você está no ZFS, você pode criar um conjunto de dados para cada diretório principal e replicá-lo para um sistema de arquivos ou sistema diferente onde um nível mais alto de compactação é definido. Incluindo possivelmente dedup.

Com base na estrutura dir, todos os arquivos são exibidos no mesmo FS que você está fazendo backup. Portanto, uma opção paralela pode não ajudar, já que suspeito que o IO será o fator limitante, não os recursos da CPU.

Você pode tentar colocar os trabalhos em segundo plano, como sugere @Romeo Ninov. Ou até mesmo criar um script para cada diretório e executá-los ao mesmo tempo. No final, apenas jogando e testando várias opções você saberá com certeza o que pode ou não ajudar a encontrar o que melhor atende às suas necessidades. Incluindo diferentes arquivadores e algoritmos de compressão.

Por exemplo, se a velocidade for mais importante, tente um nível mais baixo de compactação em gzip ou use compress ou zip .

Além disso, se você não acha que a CPU é um problema e tem vários, você pode tentar usar um pigz (implementação paralela do gzip) para ver se isso ajuda. Esse pkg está no repositório de suporte para v11, mas você precisa obter o código-fonte e compilá-lo para versões anteriores do Solaris.

Recrete também timex na frente de cada comando, já que pode ser apenas um dos diretórios. dando-lhe a lentidão. Se sim, concentre-se em otimizar esse.

    
por 03.05.2017 / 23:23

Tags