cp/rsync는 비동기식인가요?

cp/rsync는 비동기식인가요?

먼저 파일을 대상에 복사한 다음 tar해당 파일을 실행하는 백업 스크립트를 실행 중입니다.

DIR2BCK='/foo/bar'
TMPDIR=$(mktemp -d)
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1
tar czf /tmp/foo.backup.tar ${TMPDIR}

이 마지막 명령을 실행한 후 때때로 다음 경고가 표시됩니다.

/tmp/tmp.blqspkA136: 파일을 읽는 동안 변경됨

압축 시 파일 변경을 방지하기 위해 대상을 임시 디렉터리에 정확하게 복사합니다. 이 동작은 . cp대신 명령 을 사용하는 경우에도 재현 가능합니다 rsync. 나는 평생 동안 이 명령들이 동기식이라고 생각했는데, 이 경고는 그 반대를 보여주는 것 같습니다.

/ 와 줄 sleep사이에 명령을 넣으면 경고가 표시되지 않지만 이것이 깨끗한 해결책은 아니라고 생각합니다.rsynccptar

몇 가지 사실:

  • 동일한 결과로 과 명령 sync사이에 명령 을 추가해 보았습니다 .rsynctar
  • @jcbermu가 제안한 대로 두 줄이 다음과 같이 스크립트를 변경해 보았습니다.

    rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
    wait
    

    스크립트를 여러 번 실행했는데 그 중 일부는 동일한 동작을 보여 복사할 때 파일이 변경되었다고 주장했습니다.

  • 사용된 파일 시스템은 ${TMPDIR}및 둘 다에 EXT4입니다 ${DIR2BCK}.

  • ${DIR2BCK}원격 파일 시스템에 있으며 실제로 이것은 원격 시스템의 삼바 마운트 지점입니다. ${TMPDIR}로컬 파일 시스템에 있습니다. 그러나 ${DIR2BCK}로컬 파일 시스템으로 변경해도 아무런 차이가 없습니다.
  • 모든 파일 시스템은 하드웨어 RAID-5 기반입니다.

이 명령은 실제로 동기식입니까? 그렇지 않은 경우 그렇게 만드는 방법이나 대체 명령이 있습니까?

답변1

한 가지 해결책은 다음과 같이 다시 작성하는 것입니다.

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 ; tar czf foo.backup.tar ${TMPDIR}

그래서 끝날 tar때까지 시작하지 않을 것입니다 rsync.


다른 해결책은 cp/를 rsync배경으로 보내고 명령으로 끝날 때까지 기다리는 것입니다 wait.

예를 들어:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
wait
tar czf foo.backup.tar ${TMPDIR}

&줄 의 마지막은 rsync실행을 백그라운드로 보냅니다.어린이현재 세션), 그런 다음 wait모든 하위 세션이 완료될 때까지 이 셸 세션을 강제로 기다리게 합니다.

답변2

rsync/cp와 tar 줄 사이에 sleep 명령을 넣었는데 경고가 표시되지 않지만 이것이 깨끗한 해결책은 아니라고 생각합니다.

당신에게 좋거나 표준이 있습니다. 수면 대신 다음을 사용하면 어떻게 되나요?

sudo 동기화; 에코 3 | sudo 티 /proc/sys/vm/drop_caches

그것이 좋은 해결책이라고 생각하시나요?

참고: /proc/sys/vm/drop_caches는 Ubuntu가 사용하는 것으로 보이며 모든 Unix(아마도 모든 Linux에서)에서 작동하는 접근 방식은 아닐 것으로 예상됩니다. 읽은 후에 언급하겠습니다.https://ubuntuforums.org/showthread.php?t=589975그리고 이 작업의 안전성에 대해 의문을 제기하는 초기 보고서를 읽은 후 그 안전성을 확인하는 더 많은 포럼 스레드 게시물을 읽습니다.

관련 정보