Bash

使用 shell 腳本定期將文件從兩個遠端伺服器傳輸到單個主機

  • May 13, 2022
  • 我有兩台遠端數據採集機,它們不斷地將數據寫入自己的本地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)。很想听聽關於如何實現這一點的評論/建議。

使用數組來包含主機對。最初,該數組只能包含一個元素,您可以稍後添加第二個主機。在這裡,我包含了兩組憑據,因此您可以查看語法。對於我選擇使用的複制,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

引用自:https://unix.stackexchange.com/questions/702319