シェルスクリプトを使用して2つのリモートサーバーから単一のホストにファイルを定期的に転送する

シェルスクリプトを使用して2つのリモートサーバーから単一のホストにファイルを定期的に転送する
  • data.txt私は常に自分のローカルファイルにデータを書き込む2つのリモートデータ収集システムを持っています。
  • リモートコンピュータは、data.txtサービスを介して電源を入れたり再起動したときにデータのインポートを開始し、新しいデータを追加しますsystemd
  • ホストは各リモートコンピュータでサービスを有効/開始します。

シェルスクリプトを使用して、そのデータファイルを定期的にホストシステムに自動的に転送したいと思います。

メモ:現時点では、1台のリモートコンピュータにのみアクセスでき、今後は2台目のリモートコンピュータにアクセスできるようになります。このマシンをオンラインに接続する準備をしようとしています。そのため、これを実装する方法の「アイデア」をテストすることはできません。

単一のリモートシステムに対してこれを実行するために実行した操作は次のとおりです。

#!/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

リモートコンピュータを使用してこのプログラムを正常に実行しました。データの損失や破損も見つかりませんでした。 2台のリモートコンピュータで動作させるために、私の最初のアイデアはwhileループの別のインスタンスを追加することでした。

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

ただし、最初のループが2番目のループ(?)を開始するために中断されないことを考えると、これがどのように機能しないかがわかります。 2番目のアイデアは単一のwhileループを使用しますが、2番目のシステムscpに別のコマンドを追加することでした。

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

コマンドの実行時間が変わると、この方法が最終的に「ドリフト」される可能性があることを理解してください。 X時間ごとに送信が発生することについて心配することはありませんが、定期的に送信するだけです(sudo)。これを達成する方法についてのコメント/提案を聞きたいです。

ベストアンサー1

配列を使用してホストペアを含めます。最初は、アレイに1つの要素のみを含めることができ、後で2番目のホストを追加できます。ここでは、構文を表示できるように両方の資格情報のセットを提供しました。私が使用することを選んだコピーを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

おすすめ記事