我有一个脚本将在每个服务器中运行并将某些文件复制到其中。脚本知道我在哪里运行以及需要复制哪些文件。
脚本将从本地数据中心复制文件local_dc
,但如果它关闭或没有响应,那么它将从远程数据中心复制相同的文件remote_dc_1
,如果也关闭,那么它将从另一个远程数据中心复制相同的文件,remote_dc_2
如下所示 -
do_Copy() {
el=$1
PRIMSEC=$2
scp david@"$local_dc":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$PRIMSEC"/. || scp david@"$remote_dc_1":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$PRIMSEC"/. || scp david@"$remote_dc_2":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$PRIMSEC"/.
}
export -f do_Copy
# copying 5 files in parallel simultaneously in primary and secondary folder
parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: $primary_partition &
parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: $secondary_partition &
wait
echo "All files copied successfully."
现在我的问题是:
- 假设如果
local_dc
机器宕机了,那么它肯定会从remote_dc_1
机器上复制吗?如果remote_dc_1
机器也宕机了,那么它也会从 复制吗remote_dc_2
? - 现在如果三台机器都宕机了会发生什么?在这种情况下,我想打印一条消息:所有三台机器都已关闭,因此退出 shell 脚本。
在不关闭机器的情况下,我无法正确测试这一点。
答案1
是的。它将尝试从第一个复制,如果失败,它将尝试第二个,如果也失败,它将尝试第三个。要让它在最后向您发送电子邮件,请使用以下命令:
scp ... || scp ... || scp || echo "All attempts failed" | mailx -r "[email protected]"
要让每个 scp 命令告诉您它是否失败,您可以使用子 shell:
scp ... || (echo "machine1 down" | mailx -r "[email protected]"&& scp ... ) ||
( echo "machine2 down" | mailx -r "[email protected]" && scp ... ) ||
echo "All attempts failed" | mailx -r "[email protected]"
答案2
将会发生什么将取决于您告诉脚本运行的任何命令。我不是一个高手,但我最近也遇到过类似的情况。
我所做的只是为可能的服务器创建一些变量,然后使用循环来测试与这些 IP 的连接,当发现有效时,将该 IP 设置为要使用的 IP (FTPHOST):
USER=用户名
PASS=密码
attempts1=your.first.server.ip
attempts2=你的.第二个.服务器.ip
attempts3=your.third.server.ip
curl --connect-timeout 5 ftp://$USER:$PASS@$attempt1 >> /dev/null 2>&1;
如果 [ $? =='0'];
then
FTPHOST=$attempt1;
echo "FTPHOST set to $FTPHOST"
else
echo "Connection to $attempt1 failed. Attempting next IP";
curl --connect-timeout 5 ftp://$USER:$PASS@$attempt2 >> /dev/null 2>&1;
if [ $? == '0' ];
then
等等,对您拥有的任意多个可能的 IP 重复循环,直到找到有效的 IP。如果都不起作用,那么您当然不会从那里下载任何内容,因此请让您的脚本相应地运行。