scp não exibe saída quando usado com gnu parallel

2

Eu tenho um script curto que usa scp para copiar arquivos para vários hosts remotos (sim, eu sei sobre rdist e rsync ; ambos não funcionam para alguns dos hosts - isso não é o ponto aqui, estou apenas copiando alguns arquivos não críticos de qualquer maneira).

A carne do roteiro é algo assim:

for h in $HOSTS; do
    echo $h
    echo '----------------------------------------'
    scp -r $FILES ${h}:
    echo ''
done

Aqui está a saída parcial da execução deste script:

protector
----------------------------------------
.bash_profile                                                                                                                100%  555     0.5KB/s   00:00    
.bashrc                                                                                                                      100% 2124     2.1KB/s   00:00    
.zshenv                                                                                                                      100%  561     0.6KB/s   00:00    
.zshrc                                                                                                                       100% 2354     2.3KB/s   00:00    
.shrc                                                                                                                        100% 1887     1.8KB/s   00:00    
.bash_logout                                                                                                                 100%   17     0.0KB/s   00:00    
.logout                                                                                                                      100%   64     0.1KB/s   00:00    
.zlogout                                                                                                                     100%   17     0.0KB/s   00:00    
.vimrc                                                                                                                       100%  717     0.7KB/s   00:00    

pup
----------------------------------------
.bash_profile                                                                                                                100%  555     0.5KB/s   00:00    
.bashrc                                                                                                                      100% 2124     2.1KB/s   00:00    
.zshenv                                                                                                                      100%  561     0.6KB/s   00:00    
.zshrc                                                                                                                       100% 2354     2.3KB/s   00:00    
.shrc                                                                                                                        100% 1887     1.8KB/s   00:00    
.bash_logout                                                                                                                 100%   17     0.0KB/s   00:00    
.logout                                                                                                                      100%   64     0.1KB/s   00:00    
.zlogout                                                                                                                     100%   17     0.0KB/s   00:00      
.vimrc                                                                                                                       100%  717     0.7KB/s   00:00    

Como este script copia para centenas de hosts, demora um pouco, então eu decidi tentar usar GNU Parallel para acelerar. Aqui está a versão revisada do script utilizando parallel (por favor, não comente sobre o echo hack no começo, não é relevante para o problema):

(for host in $(echo $HOSTS); do echo $host; done) | parallel "echo {}; echo '----------------------------------------' ; scp -r $FILES {}: ; echo ''"

O problema é que a saída de usar scp dessa maneira se parece com isso:

pup
----------------------------------------

soils
----------------------------------------

Como os comandos estão sendo executados em paralelo, a ordenação é diferente e o paralelismo parece ser concluído muito mais rápido que um loop for de scps, mas como você pode ver, não há saída para stdout de scp. Não consigo descobrir por que - a saída para stdout do eco não está sendo suprimida, por exemplo. Quando tento scp -v dentro de paralelo, recebo uma saída detalhada parcial, mas não obtenho nenhuma informação usual de tamanho / hora.

Existe alguém que saiba por que a saída do scp está sendo suprimida?

    
por jayhendren 16.11.2013 / 00:47

2 respostas

1

Para enganar scp ao pensar que tem um tty conectado, você pode usar script :

script -c 'scp foo server1:/bar/'

Então, para executar isso com parallel você precisa de algo como:

parallel -j30 "echo {}; echo '----------------------------------------' ; script -c 'scp -r $FILES {}:' ; echo ''"   ::: $HOSTS

Para saber mais, confira os vídeos de introdução ( link ), os EXEMPLOs (n1_argument_appending "> http: //www.gnu.org/software/parallel/man.html#example__working_as_xargs_n1_argument_appending), e o tutorial ( link ).

    
por 17.11.2013 / 09:04
0

Isso parece funcionar para mim:

#!/bin/sh

for h in $(cat /tmp/servers);
do
    for f in $(cat /tmp/files);
    do
        echo $h
        echo '----------------------'
        parallel -vv "scp root@$h:$f /tmp"
    done
done

Pegue o -vv out para remover a saída detalhada. E, claro, modificá-lo de modo que A) ele use suas variáveis $ HOSTS e $ FILES, e B) copie para o servidor remoto ao invés de.

    
por 16.11.2013 / 04:21