각 서버에서 실행되어 특정 파일을 복사하는 스크립트가 있습니다. 스크립트는 내가 실행 중인 위치와 복사해야 할 파일을 알고 있습니다.
스크립트는 로컬 데이터 센터에서 파일을 복사 local_dc
하지만 작동이 중단되거나 응답하지 않는 경우 원격 데이터 센터에서 동일한 파일을 복사하고 , 또한 작동이 중단된 경우 표시된 대로 remote_dc_1
다른 원격 데이터 센터에서 동일한 파일을 복사합니다. remote_dc_2
아래에 -
do_Copy() {
el=$1
PRIMSEC=$2
scp david@"$local_dc":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$PRIMSEC"/. || scp david@"$remote_dc_1":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$PRIMSEC"/. || scp david@"$remote_dc_2":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$PRIMSEC"/.
}
export -f do_Copy
# copying 5 files in parallel simultaneously in primary and secondary folder
parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: $primary_partition &
parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: $secondary_partition &
wait
echo "All files copied successfully."
이제 내 질문은 다음과 같습니다.
local_dc
기계가 다운되면 확실히remote_dc_1
기계에서 복사 될 것이라고 가정합니까 ? 시스템도 다운된 경우remote_dc_1
에서 복제됩니까remote_dc_2
?- 이제 세 대의 머신이 모두 다운되면 어떻게 될까요? 이 경우 메시지를 인쇄하고 싶습니다. 세 대의 시스템이 모두 종료되었으므로 쉘 스크립트를 종료하십시오.
기계를 끄지 않고서는 이것을 제대로 테스트할 수 없습니다.
답변1
예. 첫 번째 항목에서 복사를 시도하고, 실패하면 두 번째 항목을 시도하고, 역시 실패하면 세 번째 항목을 시도합니다. 마지막에 이메일을 받으려면 다음 명령을 사용하십시오.
scp ... || scp ... || scp || echo "All attempts failed" | mailx -r "[email protected]"
각 scp 명령이 실패했는지 알려 주려면 하위 쉘을 사용할 수 있습니다:
scp ... || (echo "machine1 down" | mailx -r "[email protected]"&& scp ... ) ||
( echo "machine2 down" | mailx -r "[email protected]" && scp ... ) ||
echo "All attempts failed" | mailx -r "[email protected]"
답변2
무슨 일이 일어날지는 스크립트에 실행하라고 지시한 명령에 따라 달라집니다. 제가 전문가는 아니지만 최근 비슷한 상황을 겪은 적이 있습니다.
내가 한 일은 가능한 서버에 대한 몇 가지 변수를 만든 다음 루프를 사용하여 해당 IP에 대한 연결을 테스트하고 작동하는 것으로 확인되면 해당 IP를 사용할 IP로 설정하는 것입니다(FTPHOST).
사용자=사용자 이름
패스=비밀번호
시도1=your.first.server.ip
시도2=your.second.server.ip
시도3=your.third.server.ip
컬 --connect-timeout 5 ftp://$USER:$PASS@$attempt1 >> /dev/null 2>&1;
if [$? =='0'];
then
FTPHOST=$attempt1;
echo "FTPHOST set to $FTPHOST"
else
echo "Connection to $attempt1 failed. Attempting next IP";
curl --connect-timeout 5 ftp://$USER:$PASS@$attempt2 >> /dev/null 2>&1;
if [ $? == '0' ];
then
그리고 작동하는 IP를 찾을 때까지 가능한 한 많은 IP를 통해 루프를 반복합니다. 둘 다 작동하지 않으면 물론 아무 것도 다운로드되지 않으므로 이에 따라 스크립트를 실행하십시오.