두 개의 별도 디렉토리가 있습니다. 사용자는 파일을 첫 번째 파일에 로드합니다. 5분마다 두 번째 디렉터리에 파일을 복사하는 cronjob이 백그라운드에서 실행되고 있습니다.
사용자가 업로드를 완료하지 않았고 cronjob이 파일을 복사하면 어떻게 되나요? 이 두 디렉토리는 서로 다른 사용자가 소유하며 cronjob은 루트로 실행됩니다.
답변1
cp
열린 파일을 인식하지 못합니다. 따라서 첫 번째 사용자가 대용량 파일을 업로드하고 cronjob(또는 다른 프로세스)이 파일 복사를 시작하면 작성된 내용만 복사됩니다. 이런 식으로 생각할 수 있습니다. cp
파일이 완전한지 여부에 관계없이 현재 디스크에 있는 것을 복사합니다. 그렇지 않으면 로그 파일 등을 복사할 수 없습니다.
답변2
cp
이러한 파일을 열 수 있는 다른 프로그램을 인식하지 못합니다. 거기에는 마법이 없습니다 cp
. 유닉스의 설계는 설득력 있는 이유가 없는 한 파일에 어떤 종류의 잠금 설정도 의도적으로 피합니다(강제적이라는 것은 커널이 잠금을 요구한다는 것을 의미합니다). 이 주제에 대해서는 다음을 참조하십시오.출력을 파일로 리디렉션하면 파일에 잠금이 적용되나요?
파일은 생산자가 생성하고 완료 후 소비자가 사용하는 것이 일반적입니다. 이를 처리하는 일반적인 방법은 생산자가 소비자가 찾지 않는 임시 파일을 작성하도록 한 다음, 생산자가 완료되면 소비자가 찾을 수 있는 위치로 파일을 이동하는 것입니다. 동일한 파일 시스템에서 파일을 이동하는 것은 원자적 작업입니다. 어느 시점에서 사용자에 관한 한 파일은 존재하지 않는 상태에서 존재하는 상태로 이동합니다.
따라서 업로드를 완료한 후 파일을 다른 디렉터리로 이동하도록 업로드 작업을 예약하십시오. 크론 작업이 이 다른 디렉토리를 가리키도록 하십시오.
답변3
디렉터리 동기화 작업을 수행하려는 것 같습니다.
왜냐하면-u, --업데이트옵션cp
원본 파일이 대상 파일보다 최신이거나 대상 파일이 누락된 경우에만 복사
cp -auv SOURCEDIR/* DESTDIR
따라서 예를 들어 수정 시간이 변경된 파일을 복사하는 cronjob을 추가할 수 있습니다 . 이는 DESTDIR
업로드가 완료되면 완전한 사본이 생성된다는 의미입니다.
rsync
같은 일을 할 수 있습니다. 예를 들어, rsync -av SOURCEDIR/ DESTDIR
.
-a 옵션을 적용하더라도 일부 지정된 속성(소유권 등)은 슈퍼유저만 보유할 수 있습니다.
자세히보다 man cp
.man rsync