gzip으로 압축하여 원격 서버로 보내야 하는 경로가 %p인 일부 파일이 있는데 rsync 및 유사한 미러링 도구를 사용할 수 없다고 가정해 보겠습니다. 나는 다음을 수행합니다.
gzip -c -9 %p | ssh user@server "cat > backupPath"
기본적인 정상적인 상황에서는 잘 작동하는데 파일 전송 중에 원격 서버 연결이 실패하면 파일이 제대로 전송되고 저장되었는지 확인하고 싶기 때문에 어떻게 되는지 알고 싶습니다. 파일의 일부만 "backupPath"에 기록됩니까, 아니면 "전부 아니면 전무" 전략을 따르게 됩니까? 즉, 오류가 발생하고 "backupPath" 주소가 있는 파일이 원격 호스트에 생성되지 않습니다(나에게 적합함). 더 나은)?
답변1
프로세스의 관점에서 보면 cat
단지 stdin에서 stdout으로 데이터를 복사하는 것일 뿐이며 데이터가 완전한지, 특히 완전한지 여부는 알 수 없습니다. 따라서 귀하의 질문에 대한 답변은 다음과 같습니다.아니요이는 "전부 아니면 전무" 전략이 아닙니다.
두 단계로 수행할 수 있으므로 더욱 강력해집니다.
#/bin/bash
set -e
set -o pipefail
gzip -c -9 %p | ssh user@server "cat > backupPath.tmp"
ssh user@server "mv backupPath.tmp backupPath"
이것은 %p
원래 게시물에서 복사되었으며 쉘 구문이 아닙니다.
답변2
이름 바꾸기는 원자적 작업이므로 다운로드가 완료된 후 파일 이름을 바꾸는 것은 옵션인 것 같습니다. 내가 아는 바로는 zip 무결성을 확인한다고 해서 파일이 완전히 다운로드되었음을 보장하는 것은 아닙니다. 파일의 해당 부분이 올바른 zip 파일일 가능성도 적습니다. 하지만 어쨌든 보안을 강화하기 위해 druben이 무결성을 검사한다는 아이디어는 마음에 듭니다. 그래서 Icarus와 Druben의 답변 덕분에 저는 최종 결정을 내렸습니다.
gzip -c -9 %p | ssh user@server 'set -e; cat > /var/tmp/file.txt.part; gzip -t /var/tmp/file.txt.part; sync /var/tmp/file.txt.part; mv /var/tmp/file.txt.part /var/tmp/file.txt'