Bash
使用 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)。很想听聽關於如何實現這一點的評論/建議。
使用數組來包含主機對。最初,該數組只能包含一個元素,您可以稍後添加第二個主機。在這裡,我包含了兩組憑據,因此您可以查看語法。對於我選擇使用的複制,
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