Linux

如何並行化 scp 命令?

  • January 16, 2014

我需要從machineBmachineC到scp 文件machineA。我正在執行我的下面的 shell 腳本machineA。我已經正確設置了 ssh 密鑰。

如果文件不在 中machineB,那麼它應該在machineC. 我需要將所有 PARTITION1 和 PARTITION2 文件移動到 machineA 相應的文件夾中,如下所示在我的 shell 腳本中 -

#!/bin/bash

readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l")

if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
   rm -r $PRIMARY/*
   rm -r $SECONDARY/*
   for el in "${PARTITION1[@]}"
   do
       scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
   done
   for sl in "${PARTITION2[@]}"
   do    
       scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
   done
fi

目前,我在 PARTITION1 和 PARTITION2 中有 5 個文件,但一般來說它將有大約 420 個文件,這意味著它會一個一個地移動文件,我認為這可能會很慢。有什麼方法可以加快這個過程嗎?

我正在執行 Ubuntu 12.04

並行化 SCP 會適得其反,除非雙方都在 SSD 上執行。SCP 最慢的部分是網路枯萎,在這種情況下並行化根本無濟於事,或者兩邊的磁碟,並行化會使情況變得更糟:尋軌時間會殺死你。

你說 machineA 在 SSD 上,所以每台機器並行化就足夠了。最簡單的方法是將第一個 forloop 包裝在子 shell 中並將其作為背景。

( for el in "${PARTITION1[@]}"
do
   scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done ) &

引用自:https://serverfault.com/questions/563413