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) 원격 서버가 아닌 원격 서버에 복사하도록 수정하세요.