ars*_*nal 5 linux ubuntu shell bash scp
我需要从SCP的文件machineB
,并machineC
到machineA
。我正在从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
Run Code Online (Sandbox Code Playgroud)
目前,我在 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 ) &
Run Code Online (Sandbox Code Playgroud)