我在machines
数组中有三台机器(每台机器位于不同的数据中心)。
abc
数据中心上运行,那么我想scp machineA.abc.host.com
中的文件,这将是我的本地框。我将选择其他两个框作为远程服务器来复制文件,因为本地框已关闭。def
数据中心上运行,那么我想scp machineB.def.host.com
中的文件,这将是我的本地框。我将选择其他两个框作为远程服务器来复制文件,因为本地框已关闭。pqr
数据中心上运行,那么我想scp machineC.pqr.host.com
中的文件,这将是我的本地框。我将选择其他两个框作为远程服务器来复制文件,因为本地框已关闭。下面是我的脚本,但我相信它可以用更好的方式完成,而不是使用三个不同的变量,然后有三个scp staetments分隔或:
machines=(machineA.abc.host machineB.def.host.com machineC.pqr.host.com)
case $(hostname -f) in
*abc.host.com)
local_server=("${machines[0]}")
primary_remote==("${machines[1]}")
secondary_remote==("${machines[2]}")
;;
*def.host.com)
local_server=("${machines[1]}")
primary_remote==("${machines[2]}")
secondary_remote==("${machines[0]}")
;;
*pqr.host.com)
local_server=("${machines[2]}")
primary_remote==("${machines[0]}")
secondary_remote==("${machines[1]}")
;;
*) echo "unknown host: $(hostname -f), exiting." >&2 && exit 1 ;;
# ?
esac
export local="$local_server"
export remote1="$primary_remote"
export remote2="$secondary_remote"
copyFiles() {
el=$1
primsec=$2
# can we just iterate from for loop instead of writing three scp statements?
(scp -C -o StrictHostKeyChecking=no goldy@"$local":/proc/data/abc_187_"$el"_111_8.data "$primsec"/.) || (scp -C -o StrictHostKeyChecking=no goldy@"$remote1":/proc/data/abc_187_"$el"_111_8.data "$primsec"/.) || (scp -C -o StrictHostKeyChecking=no goldy@"$remote2":/proc/data/abc_187_"$el"_111_8.data "$primsec"/.)
}
export -f copyFiles
# using gnu parallel here to call above methods parallely
现在您可以看到我有三个scp语句,一个用于本地方框,另一个用于remote1和remote2。我在想的可能是我们可以摆脱这三个scp语句,而是在一个数组中存储主机名(按特定顺序,第一个索引可以是本地框,其他两个可以是远程),然后从for循环中迭代该数组并写一个scp语句?
for p in "$machines"; do scp -C -o StrictHostKeyChecking=no goldy@"$p":/proc/data/abc_187_"$el"_111_8.data "$primsec"/. && break; done > /dev/null 2>&1
如果可以,那么我如何相应地重新调整machines
数组,或者创建一个不同的数组,然后在适当的索引处使用正确的机器?
更新
不知何故,我在该函数中的for循环根本没有运行:
copyFiles() {
local el=$1
local primsec=$2
local remote_file="/proc/data/abc_187_${el}_111_8.data"
for host in "${hosts[@]}"; do
echo "$host"
echo "scp -C -o StrictHostKeyChecking=no "goldy@$host:$remote_file" "$primsec"/." && break
done
}
export hosts
export -f copyFiles
parallel -j 5 copyFiles {} $proc::: ${pro[@]} &
parallel -j 5 copyFiles {} $data::: ${seco[@]} &
wait
echo "everything copied"
答案 0 :(得分:2)
这个怎么样:它使用
#!/bin/bash
declare -A machines=(
[abc]=machineA.abc.host.com
[def]=machineB.def.host.com
[pqr]=machineC.pqr.host.com
)
IFS=. read -a host_parts < <(hostname -f)
case "${host_parts[1]}" in
abc) hosts=( "${machines[abc]}" "${machines[def]}" "${machines[pqr]}" ) ;;
def) hosts=( "${machines[def]}" "${machines[pqr]}" "${machines[abc]}" ) ;;
pqr) hosts=( "${machines[pqr]}" "${machines[abc]}" "${machines[def]}" ) ;;
*) echo "unknown host: $(hostname -f), exiting." >&2; exit 1 ;;
esac
copyFiles() {
local el=$1
local primsec=$2
local remote_file="/proc/data/abc_187_${el}_111_8.data"
for host in "${hosts[@]}"; do
scp -C -o StrictHostKeyChecking=no "goldy@$host:$remote_file" "$primsec"/. && break
done
}
export hosts
export -f copyFiles