如果本地计算机出现故障,如何从其他服务器复制文件

如果本地计算机出现故障,如何从其他服务器复制文件

我有一个脚本将在每个服务器中运行并将某些文件复制到其中。脚本知道我在哪里运行以及需要复制哪些文件。

脚本将从本地数据中心复制文件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。如果都不起作用,那么您当然不会从那里下载任何内容,因此请让您的脚本相应地运行。

相关内容