[storage] 완료되지 않은 소스 파일을 제거하지 못하도록 rsync 유지

속도와 질량의 두 기계가 있습니다. speed는 빠른 인터넷 연결을 가지고 있으며 크롤러를 실행하여 많은 파일을 디스크에 다운로드합니다. 질량에는 디스크 공간이 많이 있습니다. 다운로드가 끝나면 파일을 속도에서 대량으로 옮기고 싶습니다. 이상적으로는 방금 실행합니다.

$ rsync --remove-source-files speed:/var/crawldir .

하지만 rsync가 아직 다운로드를 완료하지 않은 소스 파일의 링크를 해제 할까 걱정합니다. (나는 소스 코드를 보았는데 이것을 막는 것을 보지 못했다.) 어떤 제안?



답변

문제가 파일을 삭제하기 전에가 아니라 완료되기 전에 파일을 전송 하는 것 같습니다 .

이것이 Linux 인 경우 프로세스 A에서 파일을 열 수 있고 프로세스 B가 파일을 링크 해제 할 수 있습니다. 오류는 없지만 물론 A는 시간을 낭비하고 있습니다. 따라서 rsync가 소스 파일을 삭제한다는 사실은 문제가되지 않습니다.

문제는 rsync가 소스 파일을 복사 한 후에 만 ​​삭제하고 여전히 디스크에 기록되는 경우 부분 파일을 갖게됩니다.

이건 어때 : 마운트 mass에서 원격 파일 시스템 (NFS가 작동합니다) speed. 그런 다음 파일을 직접 웹 크롤링하십시오.


답변

다운로드 프로세스를 얼마나 제어 할 수 있습니까? 직접 롤백하는 경우 다운로드중인 파일을 임시 디렉토리로 이동하거나 다운로드가 완료 될 때까지 임시 이름을 지정한 다음 완료되면 올바른 이름으로 mv를 설정할 수 있습니다. 타사 소프트웨어를 사용하는 경우 많은 제어 권한이 없지만 임시 디렉토리 작업을 수행 할 수 있습니다.


답변

Rsync는 특정 패턴과 일치하는 파일을 제외 할 수 있습니다. 파일을 임시 디렉토리로 다운로드하도록 수정할 수없는 경우에도 다운로드 중에 파일 이름을 다르게 지정하는 규칙이있을 수 있으며 (예 : foo.downloading이라는 파일을 다운로드하는 동안 foo)이 특성을 사용하여 파일을 제외 할 수 있습니다. 여전히 복사에서 다운로드되고 있습니다.


답변

크롤링 프로세스를 제어하거나 예측 가능한 출력이있는 경우, 위의 솔루션 (완료 될 때까지 임시 파일에 저장 한 다음 완료된 다운로드 위치로 mv’ing 또는 ‘.downloading’종류의 이름을 가진 파일 무시) 작동 할 수 있습니다. 그 모든 것이 통제 할 수없는 경우 ‘lsof $ filename’을 수행하고 결과가 있는지 확인하여 프로세스가 파일을 열지 않도록 할 수 있습니다. 아무도 파일을 열지 않은 경우 파일을 옮기는 것이 안전합니다.


답변