Linux
如何並行化 scp 命令?
我需要從
machineB
和machineC
到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 ) &