“cp”는 열린 파일을 어떻게 처리합니까?


15

두 개의 별도 디렉토리가 있습니다. 사용자는 파일을 첫 번째 파일로로드합니다. 백그라운드에서 cronjob이 실행되어 5 분마다 파일을 두 번째 디렉토리로 복사합니다.

사용자가 업로드를 완료하지 않고 cronjob이 파일을 복사하면 어떻게됩니까? 두 디렉토리는 다른 사용자가 소유하고 있으며 cronjob은 루트로 수행됩니다.


이러한 경우에 어떻게되는지이 게시물을 읽어보십시오 : unix.stackexchange.com/questions/49299/...은
서지

고마워, 당신이 쓴 좋은 게시물. 그러나 내 질문은 일반적인 리눅스 파일 처리가 아니라 더 cp 관련이었습니다. 그러나 cp는 파일이 여전히 열려 있는지 확인하고 닫힐 때까지 기다립니다.
Stuffy

아니요 cp. 파일이 완전히 업로드 될 때까지 기다리지 않습니다. 네트워크 전송률이 동일한 호스트 내의 한 위치에서 다른 위치로 파일을 복사하는 것보다 낮을 것으로 예상되면 어느 시점 cp에서 현재 파일 끝에 도달하여 복사가 중지됩니다. 문제에 대한 해결책은 간단 할 수 있습니다. 먼저 사용자가 특수하게 엉망으로 된 파일 이름으로 파일을 업로드합니다 (예 : .(점 문자) 앞에 붙임 ) 전송이 완료되면 사용자가 원래 이름으로 이름을 바꿉니다. 파일에 대한로 시작되지 않은 ..
서지

답변:


17

cp열린 파일에 대해 모른다. 따라서 첫 번째 사용자가 큰 파일을 업로드하고 cronjob (또는 다른 프로세스)이이 파일을 복사하기 시작하면 이미 작성된만큼만 복사합니다. 이 방법으로 생각할 수 있습니다 cp. 파일이 완료 되더라도 현재 디스크에있는 내용을 복사합니다. 그렇지 않으면 예를 들어 로그 파일을 복사 할 수 없습니다.


고마워, 그게 내가 알고 싶었어! 그것을 피할 수있는 간단한 방법이 있습니까? cp 매뉴얼 페이지를 확인했지만 아무 것도 사용하지 않았습니다.
Stuffy

정확히 무엇을하기 위해? 열린 파일을 제외한 모든 파일을 복사하려면? 이 작업을 수행하는 쉬운 방법은 없다고 생각합니다 ( fuser+ 를 사용하는 스크립트를 작성하는 것 외에는 cp그러한 복사는 매우 신뢰할 수 없습니다. 예를 들어 텍스트 편집기에서 열린 파일은 복사하지 않습니다)
Krzysztof Adamski

@Stuffy, 아마도 cronjob에서 열린 파일을 나열 할 수 lsof있습니까? 그 결과는 쉽게 처리 할 수 ​​있습니다. cp쓰기 위해 열려있는 파일을 필터링 할 수 있습니다 (예 :의 인스턴스별로 ).
Wojtek Rzepala

@WojtekRzepala, 감사합니다. 어쩌면 나는 cronjob에 의해 실행되는 작은 스크립트를 작성합니다
Stuffy

@Stuffy : fuser이 도구가 모든 파일을 표시하지 않을 수 있으므로 루트 사용자가 실행하지 않으면 신뢰할 수 없을 수도 있습니다 ( 물론 동일한 문제가 있음 ).
Krzysztof Adamski

7

cp다른 프로그램에서 파일을 열 었는지 모릅니다. 에 마술이 없습니다 cp. 유닉스의 디자인은 설득력있는 이유가없는 한 (커널이 필요로하는 것을 의미하는 경우가 아니라면) 파일에 어떤 종류의 잠금 장치도 넣지 않도록 의도적으로 방지합니다. 이 주제에서 출력을 파일로 경로 재 지정은 파일에 잠금을 적용합니까?를 참조하십시오 .

파일이 생산자에 의해 생성되고 완료되면 소비자가 소비하는 이러한 상황이 일반적입니다. 이를 처리하는 일반적인 방법은 생산자가 소비자가 찾지 않을 임시 파일을 작성하도록 한 다음 생산자가 완료되면 소비자가 파일을 찾을 수있는 위치로 파일을 이동하는 것입니다. (동일한 파일 시스템에서) 파일 이동은 원자적인 작업입니다. 어떤 시점에서 소비자의 경우 파일이 존재하지 않는 것에서 존재하지 않는 것으로 변경됩니다.

따라서 업로드 작업이 완료되면 파일을 다른 디렉토리로 이동하도록 업로드 작업을 준비하십시오. 이 다른 디렉토리를 크론 작업으로 지정하십시오.


6

디렉토리 동기화 작업을 수행하려는 것 같습니다.

때문에 -u, --update 의 옵션cp

SOURCE 파일이 대상 파일보다 최신이거나 대상 파일이 누락 된 경우에만 복사

따라서 cp -auv SOURCEDIR/* DESTDIR수정 시간이 변경된 파일을 복사 하는 cronjob을 추가 할 수 있습니다 . 즉 DESTDIR, 업로드가 완료되는 동안 결국 완전한 사본을 얻습니다.

rsync같은 일을 할 수 있습니다. 예를 들어, rsync -av SOURCEDIR/ DESTDIR.

-a 옵션이 적용되었지만 일부 지정된 속성 (예 : 소유권)은 수퍼 유저 만 보존 할 수 있습니다.

참조 man cp, man rsync자세한 내용은.


대상 폴더의 최근 항목에 의존하기 만하면됩니다. 완전한 파일이 아닐 수도 있습니다.
dubiousjim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.