我使用下面的脚本从远程服务器并行复制文件:
#!/bin/bash
primary=/bat/primary
secondary=/bat/secondary
do_copy() {
el=$1
primsec=$2
(scp -C -o StrictHostKeyChecking=no \
goldy@"$remote":"$pod1"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)\
|| \
(scp -C -o StrictHostKeyChecking=no \
goldy@"$remote":"$pod2"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)\
|| \
(scp -C -o StrictHostKeyChecking=no \
goldy@"$remote":"$pod3"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)\
|| \
(scp -C -o StrictHostKeyChecking=no \
goldy@"$remote":"$pod4"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)
}
export -f do_copy
parallel -j "$5" do_copy {} $primary ::: ${pri[@]} &
parallel -j "$5" do_copy {} $secondary ::: ${snd[@]} &
wait
echo "all files copied"在远程服务器上,我有四个文件夹,由$pod1、$pod2、$pod3和$pod4表示。如果$pod1中没有文件,那么它应该在$pod2中,或者在$pod3中,或者在$pod4文件夹中。
现在我想做的是:
我尝试在最后一个exit命令旁边添加scp命令,但它只是从子whole退出,而不是从整个脚本中退出。有办法做这些事吗?
发布于 2018-04-26 06:53:12
我假设文件只存在于一个荚上,所以尝试所有的荚都不是问题。
#!/bin/bash
primary=/bat/primary
secondary=/bat/secondary
# Activate parset and env_parallel if not already done
. `which env_parallel.bash`
# Make array with $primary as many times as elements in $pri
parset prim -N0 echo $primary ::: ${pri[@]}
# Make array with $secondary as many times as elements in $pri
parset seco -N0 echo $secondary ::: ${sec[@]}
export remote
do_copy() {
el=$1
primsec=$2
pod=$3
scp -C -o StrictHostKeyChecking=no \
goldy@"$remote":"$pod"/abc_187_"$el"_111_8.data "$primsec"/
}
export -f do_copy
copy_one_file() {
parallel do_copy $1 $2 ::: pod{1..4}
if [ $? == 4 ] ; then
return 1
else
return 0
fi
}
export -f copy_one_file
parallel --halt now,fail=1 copy_one_file ::: ${pri[@]} ${sec[@]} :::+ ${prim[@]} ${seco[@]}parset使用$primary制作一个与$pri一样长的数组。
:::+将$pri中的元素链接到$prim中的元素。
对于parset,需要并行版本> 20170422。
https://stackoverflow.com/questions/49951854
复制相似问题