使用 shell 脚本定期将文件从两个远程服务器传输到单个主机

使用 shell 脚本定期将文件从两个远程服务器传输到单个主机
  • 我有两台远程数据采集机,它们不断地将数据写入自己的本地data.txt文件。
  • 远程计算机开始获取数据并data.txt在通过服务加电/重新启动时附加新数据systemd
  • 主机启用/启动每台远程计算机上的服务。

我想使用 shell 脚本定期自动地将它们各自的数据文件传输到我的主机。

笔记:我目前只能访问一台远程计算机,将来可以访问第二台远程计算机。我正在努力为这台机器上线做好准备。这就是为什么我无法测试我的“想法”如何实现这一点。

以下是我为单个远程计算机完成此任务所做的准备:

#!/usr/bin/env bash

#Enable data acquisition service on remote machine
REMOTE1="user@remote1"
REMOTE2="user@remote2"

ssh $REMOTE1 "systemctl start my.service"
while [ $? -ne 0 ]; do !!; done # waits for service to start, returns 0

ssh $REMOTE2 "systemctl start my.service"
while [ $? -ne 0 ]; do !!; done

# transfer data file every 60 seconds, until SIGINT from host
while sleep 60; do scp $REMOTE1:/data1.txt /host/; done

exit 0

我已经使用一台远程计算机成功运行了此程序;我也没有注意到任何丢失的数据/损坏。为了让它在两台远程机器上工作,我的第一个想法是添加 while 循环的另一个实例:

while sleep 60; do scp $REMOTE1:/data1.txt /host/; done
while sleep 60; do scp $REMOTE2:/data2.txt /host/; done

但是,我可以看到这可能行不通......鉴于第一个循环永远不会中断以开始第二个循环(?)。我的第二个想法是使用单个 while 循环,但scp为第二台机器添加另一个命令:

while sleep 60; do scp $REMOTE1:/data1.txt /host/; scp $REMOTE2:/data2.txt /host/; done

我知道如果命令执行时间变化,此方法可能最终会“漂移”。虽然我并不担心传输每隔 X 时间发生一次,但它只需要定期发生 (sudo)。很想听到关于如何实现这一目标的评论/建议。

答案1

使用数组来包含这对主机。最初,该数组只能包含一个元素,您可以稍后添加第二个主机。在这里,我提供了两组凭据,以便您可以看到语法。对于我选择使用的复制,但如果您愿意,rsync也可以恢复使用。scp

#!/bin/bash

# Remote credentials
remotes=('user@remote1' 'user@remote2')

# Enable data acquisition service
for remote in "${remotes[@]}"
do
    ssh -n "$remote" 'systemctl start my.service'
done

# Transfer data file with an interval of 60 seconds, until SIGINT
while sleep 60
do
    for remote in "${remotes[@]}"
    do
        rsync -tz --contimeout=10 "$remote:/data1.txt" /host/
        # scp -pC "$remote:/data1.txt" /host/
    done
done

# Forever

循环在执行之间延迟 60 秒,因此,如果每个副本花费 15 秒,则实际上每 90 秒循环一次。如果您希望循环以分钟为目标,而不管复制持续时间如何,您可以使用bash的内置时钟:

interval=60 start=$SECONDS
while sleep $(( interval - ((SECONDS - start) % interval) ))
do
done

相关内容