scp는 gnu 병렬과 함께 사용될 때 출력을 표시하지 않습니다.

scp는 gnu 병렬과 함께 사용될 때 출력을 표시하지 않습니다.

scp여러 원격 호스트에 파일을 복사 하는 짧은 스크립트가 있습니다 (예, 알고 rdist있습니다 rsync. 일부 호스트에서는 모두 작동하지 않습니다. 여기서는 그게 요점이 아닙니다. 어쨌든 중요하지 않은 일부 파일만 복사합니다).

스크립트의 내용은 다음과 같습니다.

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

다음은 이 스크립트 실행의 일부 출력입니다.

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    

이 스크립트를 수백 개의 호스트에 복제하는 데 시간이 걸리기 때문에 다음을 사용하기로 결정했습니다.GNU 병렬속도를 높이기 위해. 다음은 사용된 스크립트의 수정된 버전입니다 parallel(처음부터 해킹에 대해 언급하지 마십시오 echo. 질문과 관련이 없습니다).

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

문제는 이 방법을 사용할 때의 출력이 scp다음과 같다는 것입니다.

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

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

명령이 병렬로 실행되기 때문에 순서가 다르며 병렬이 scps의 for 루프보다 훨씬 빠르게 완료되는 것처럼 보이지만 보시다시피 scp에는 stdout으로의 출력이 없습니다. 이유를 이해할 수 없습니다. 예를 들어 echo에서 stdout으로의 출력이 억제되지 않습니다. 내부적으로 병렬화를 시도하면 scp -v부분적으로 자세한 출력이 표시되지만 일반적인 크기/시간 정보는 표시되지 않습니다.

scp 출력이 억제되는 이유를 아는 사람이 있습니까?

답변1

scp연결 되어 있다고 생각하도록 속이려면 다음을 tty사용할 수 있습니다 script.

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

따라서 실행하려면 parallel다음과 같은 것이 필요합니다.

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

자세한 내용은 소개 비디오(https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1), 예(n1_argument_appending">http://www.gnu.org/software/parallel/man.html#example__working_as_xargs_n1_argument_appending) 및 튜토리얼(http://www.gnu.org/software/parallel/parallel_tutorial.html).

답변2

이것은 나에게 효과적인 것 같습니다.

#!/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

자세한 출력을 제거하려면 -vv를 선택하십시오. 물론 A) $HOSTS 및 $FILES 변수를 사용하고 B) 원격 서버가 아닌 원격 서버에 복사하도록 수정하세요.

관련 정보