data.txt
나는 지속적으로 자신의 로컬 파일 에 데이터를 쓰는 두 대의 원격 데이터 수집 시스템을 가지고 있습니다 .- 원격 컴퓨터는
data.txt
서비스를 통해 전원을 켜거나 다시 시작할 때 데이터 가져오기를 시작하고 새 데이터를 추가합니다systemd
. - 호스트는 각 원격 컴퓨터에서 서비스를 활성화/시작합니다.
쉘 스크립트를 사용하여 해당 데이터 파일을 정기적으로 호스트 시스템으로 자동 전송하고 싶습니다.
노트:현재는 하나의 원격 컴퓨터에만 액세스할 수 있으며 앞으로는 두 번째 원격 컴퓨터에도 액세스할 수 있을 것입니다. 이 기계를 온라인에 접속할 준비를 하려고 합니다. 그렇기 때문에 이것을 구현하는 방법에 대한 "아이디어"를 테스트할 수 없습니다.
단일 원격 시스템에 대해 이 작업을 수행하기 위해 수행한 작업은 다음과 같습니다.
#!/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