Cópia de arquivos com concorrência em Bash

concorrente-1_abertura.png

Em substituição de processos, demonstrei a concorrência utilizando o vimdiff para a comparação de dois arquivos baixados simultaneamente por instâncias do curl, cada uma em subshells distintas. Mas é possível aplicar a concorrência para tarefas bem mais simples e rotineiras como, por exemplo, a cópia de arquivos.

Nesta caso copiar os pacotes no cache do APT de um host para um diretório compartilhado da rede e todos (quase que) de uma vez só:

for i in $( ls /var/cache/apt/archives/*.deb ); do
    ( cp ${i} /mnt/ubuntu & )
done

Diferente da estratégia normal de copiar um arquivo por vez, cada arquivo criará uma subshell que será executada em segundo plano junto com as demais.

$ ps xa
...
 4798 pts/0  D   0:00 cp /var/cache/apt/archives/thunderbird-locale-
 4808 pts/0  D   0:00 cp /var/cache/apt/archives/uno-libs3_5.4.2-0ub
 4810 pts/0  D   0:00 cp /var/cache/apt/archives/ure_5.4.2-0ubuntu0.

É claro que o método rápido mas não é nem um pouco econômico visto que cria diversos processos e consome memória e outros recursos do sistema. Mas como são tarefas pequenas são executadas rapidamente — é a cópia de um arquivo — e então não chega a sobrecarregar o sistema.

Ah sim, o exemplo também funciona bem com curl, scp ou wget! 🙂

Anúncios

3 comentários sobre “Cópia de arquivos com concorrência em Bash

  1. Eu fui testar com rsync, mas não funcionou e listando tudo da minha home, mas não funcionou. Estou procurando uma solução pra um rsync com concorrência por que tenho muitos arquivos pequenos e demora demais pra fazer backup em rede.

    De qualquer modo, o artigo ficou bem legal e me lembrei das aulas de Shel que tinha.
    Um abraço!

    Curtir

Os comentários estão desativados.